Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define eps 1e-7
- #define turn 1e-2
- #define MOD 1000000007
- #define full(s) s.begin(), s.end()
- #define rep(i, n) for (long long i=0; i<n; i++)
- #define rrep(i, n) for (long long i=n-1; i>=0; i--)
- #define ret return
- #define pb push_back
- #define mp make_pair
- #define ft first
- #define sd second
- #define pll pair<long long, long long>
- #define mll map<long long, long long>
- #define sll set<long long>
- using namespace std;
- typedef long long ll;
- typedef long double ld;
- ll N=5, numbOfRoot{};
- ld polynom[5]{-0.52674897119, -75.2098765432, -1.18518518519, -16.7777777778, -2.66666667};
- ld k[4];
- set<pair<ld, ld>> interv;
- ld poly(ld x);
- ld dpoly(ld x);
- ld nx(ld x);
- ld solve(ld l, ld r);
- void allFind();
- void find(ld l, ld r);
- void fixPoly();
- void printPoly();
- void revProd();
- void revSum();
- ld findK1();
- void printPoly(){
- cout << "\n@@@@@@@@@@@\n";
- rep(i, N){
- cout << polynom[i] << ' ';
- }
- cout << "\n@@@@@@@@@@@\n";
- }
- void fixPoly(){ // еÑли нулевой коÑффициент отрицательный, полином умножаетÑÑ Ð½Ð° -1
- if(polynom[0]<0)
- rep(i, N)
- polynom[i]*=-1;
- }
- void revSum(){ // замена z=-x
- rep(i, N){
- polynom[i]*=pow(-1, N-i-1);
- }
- fixPoly();
- }
- void revProd(){ // замена z=1/x
- reverse(polynom, polynom+N);
- fixPoly();
- }
- void findK(){ // поиÑк вÑех K
- k[0]=findK1();
- revProd(), k[1]=1./findK1();
- revProd(), revSum(), k[2]=-findK1();
- revProd(), k[3]=-1./findK1();
- revProd(), revSum();
- 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]);
- }
- ld findK1(){
- ll m=-1;
- ld am{};
- rep(i, N){
- if (polynom[i]<0){
- if (m<0)
- m=i;
- am=max(am, fabs(polynom[i]));
- }
- }
- return max((ld)0, 1+(m==0?1:(ld)pow(am/polynom[0], 1./m)));
- }
- ld poly(ld x){
- ret (ld)63*(ld)pow(x, 5)-76*(ld)pow(x, 3)+15*(ld)x-8./(2*x+3);
- }
- ld dpoly(ld x){
- ret 315*pow(x, 4)-228*pow(x, 2)+16/pow(2*x+3, 2)+15;
- }
- ld newx(ld x){
- ret (ld)(x-(ld)poly(x)/dpoly(x));
- }
- void allFind(){
- find(k[1], k[0]);
- find(k[2], k[3]);
- }
- void find(ld l, ld r){
- ld nx=l;
- while(nx<=r){
- if (poly(nx)*(poly(nx+turn))<0){
- interv.insert({nx, nx+turn});
- //cout << nx << ' ' << poly(nx) << ' ' << nx+turn << ' ' << poly(nx+turn) << endl;
- }
- nx+=turn;
- }
- }
- void allSol(){
- interv.clear();
- numbOfRoot=0;
- fixPoly();
- findK();
- cout << "\nk1: " << k[0] << ", \nk2: " << k[1] << ", \nk3: " << k[2] << ", \nk4: " << k[3] << "\n\n";
- allFind();
- for(auto inter:interv){
- //cout << inter.first << ' ' << inter.second << endl;
- ld nx = solve(inter.ft, inter.sd);
- if (nx==MOD){
- cout << "~~~~~~~~~~~~~~~~~~~~~~~NOT ROOT!!!\n\n";
- continue;
- }
- cout << "~~~~~~~~~~~~~~~~~~~~~~~Root #" << ++numbOfRoot << ": " << nx << "\n\n";
- }
- }
- ld solve(ld l, ld r){
- ll numberOfTurn{};
- ld nx=(l+r)/2., prx=nx-1;
- while(fabs(nx-prx)>eps){
- cout << "\nNumber of turn = " << numberOfTurn << "\npoly(x) = " << poly(nx) << ' ' << "\nx("<<numberOfTurn<<") = " << setprecision(15) << nx << "\n";
- numberOfTurn++;
- prx=nx;
- nx=newx(nx);
- if (nx<l-turn || nx>r+turn)
- ret MOD;
- }
- ret nx;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement