Advertisement
Guest User

Untitled

a guest
Oct 25th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.40 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define eps 1e-7
  3. #define turn 1e-2
  4. #define MOD 1000000007
  5. #define full(s) s.begin(), s.end()
  6. #define rep(i, n) for (long long i=0; i<n; i++)
  7. #define rrep(i, n) for (long long i=n-1; i>=0; i--)
  8. #define ret return
  9. #define pb push_back
  10. #define mp make_pair
  11. #define ft first
  12. #define sd second
  13. #define pll pair<long long, long long>
  14. #define mll map<long long, long long>
  15. #define sll set<long long>
  16.  
  17. using namespace std;
  18.  
  19. typedef long long ll;
  20. typedef long double ld;
  21.  
  22. ll N=5, numbOfRoot{};
  23. ld polynom[5]{-0.52674897119, -75.2098765432, -1.18518518519, -16.7777777778, -2.66666667};
  24.  
  25. ld k[4];
  26. set<pair<ld, ld>> interv;
  27. ld poly(ld x);
  28. ld dpoly(ld x);
  29. ld nx(ld x);
  30. ld solve(ld l, ld r);
  31. void allFind();
  32. void find(ld l, ld r);
  33. void fixPoly();
  34. void printPoly();
  35. void revProd();
  36. void revSum();
  37. ld findK1();
  38.  
  39. void printPoly(){
  40.         cout << "\n@@@@@@@@@@@\n";
  41.     rep(i, N){
  42.         cout << polynom[i] << ' ';
  43.     }
  44.     cout << "\n@@@@@@@@@@@\n";
  45. }
  46. void fixPoly(){                    // если нулевой коэффициент отрицательный, полином умножается на -1
  47.     if(polynom[0]<0)
  48.         rep(i, N)
  49.             polynom[i]*=-1;
  50. }
  51. void revSum(){                     // замена z=-x
  52.     rep(i, N){
  53.         polynom[i]*=pow(-1, N-i-1);
  54.     }
  55.     fixPoly();
  56. }
  57. void revProd(){                    // замена z=1/x
  58.     reverse(polynom, polynom+N);
  59.     fixPoly();
  60. }
  61. void findK(){                      // поиск всех K
  62.     k[0]=findK1();
  63.     revProd(), k[1]=1./findK1();
  64.     revProd(), revSum(), k[2]=-findK1();
  65.     revProd(), k[3]=-1./findK1();
  66.     revProd(), revSum();
  67.     k[0]=min((ld)1000, k[0]), k[1]=min((ld)1000, k[1]), k[2]=max((ld)-1000, k[2]), k[3]=max((ld)-1000, k[3]);
  68. }
  69. ld findK1(){
  70.     ll m=-1;
  71.     ld am{};
  72.     rep(i, N){
  73.         if (polynom[i]<0){
  74.             if (m<0)
  75.                 m=i;
  76.             am=max(am, fabs(polynom[i]));
  77.         }
  78.     }
  79.     return max((ld)0, 1+(m==0?1:(ld)pow(am/polynom[0], 1./m)));
  80. }
  81. ld poly(ld x){
  82.     ret (ld)63*(ld)pow(x, 5)-76*(ld)pow(x, 3)+15*(ld)x-8./(2*x+3);
  83. }
  84. ld dpoly(ld x){
  85.     ret 315*pow(x, 4)-228*pow(x, 2)+16/pow(2*x+3, 2)+15;
  86. }
  87. ld newx(ld x){
  88.     ret (ld)(x-(ld)poly(x)/dpoly(x));
  89. }
  90. void allFind(){
  91.     find(k[1], k[0]);
  92.     find(k[2], k[3]);
  93. }
  94. void find(ld l, ld r){
  95.     ld nx=l;
  96.     while(nx<=r){
  97.         if (poly(nx)*(poly(nx+turn))<0){
  98.             interv.insert({nx, nx+turn});
  99.             //cout << nx << ' ' << poly(nx) << ' '  << nx+turn << ' ' << poly(nx+turn) << endl;
  100.         }
  101.         nx+=turn;
  102.     }
  103. }
  104. void allSol(){
  105.     interv.clear();
  106.     numbOfRoot=0;
  107.     fixPoly();
  108.     findK();
  109.     cout << "\nk1: " << k[0] << ", \nk2: "  << k[1] << ", \nk3: " << k[2] << ", \nk4: " << k[3] << "\n\n";
  110.     allFind();
  111.     for(auto inter:interv){
  112.         //cout << inter.first << ' ' << inter.second << endl;
  113.         ld nx = solve(inter.ft, inter.sd);
  114.         if (nx==MOD){
  115.             cout << "~~~~~~~~~~~~~~~~~~~~~~~NOT ROOT!!!\n\n";
  116.             continue;
  117.         }
  118.         cout << "~~~~~~~~~~~~~~~~~~~~~~~Root #" << ++numbOfRoot << ": " << nx << "\n\n";
  119.     }
  120. }
  121. ld solve(ld l, ld r){
  122.     ll numberOfTurn{};
  123.     ld nx=(l+r)/2., prx=nx-1;
  124.     while(fabs(nx-prx)>eps){
  125.         cout << "\nNumber of turn = " << numberOfTurn << "\npoly(x)        = " << poly(nx) << ' ' << "\nx("<<numberOfTurn<<")           = " << setprecision(15) << nx   <<  "\n";
  126.         numberOfTurn++;
  127.         prx=nx;
  128.         nx=newx(nx);
  129.         if (nx<l-turn || nx>r+turn)
  130.             ret MOD;
  131.     }
  132.     ret nx;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement