Laguerre polynomials
Loading...
Searching...
No Matches
Laguerre15m.h
Go to the documentation of this file.
1
2
3int tdeg;
4void bernoullid(){
5 int k, k0, steps, n, kn1, be, se;
6 float cla, kden,asa,qsa,i,j, s,t, pn,u1,u2,res3,d1,terr1;
7
8 while(tca[k] != 0 && k < tdeg){++k;}
9 k0 = k;
10
11 kden = -tca[0]/(k0*tca[k0]);
12
13 int *kia = new int[steps+1]; // each element equal to k0
14 int *tqa = new int[steps+1]; // each element equal to tdeg*kden
15 int *asa = new int[tdeg+1]; // 0
16 int *qsa = new int[tdeg+1]; // 0
17
18 for(int n=0; n < steps; ++n){
19 kn1 = kia[n-1];
20 if(kn != n){
21 kia[n]=kn1;
22 tqa[n]=0;
23 continue;
24 }
25
26 k=n; be=std::max(0,n-tdeg);
27
28 while(pn != 0 && k != tdeg){
29 k+=1;
30 se=std::min(k,tdeg);
31 for(int t=k-n+1; t <= se; ++t){
32 asa[t] = tqa[k-t] != 0 ? tca[t] : 0;
33 for(int s=k-t-be; n-1-be; ++s){
34 qsa[0] = (s+be == 0)*(k*kden) + (s+be != 0)*qsa[0];
35 qsa[s] = (s+be == 0)*(tqa[s+be] != 0 ? tqa[s+be] : 1);
36 }
37 }
38
39 pn = se<=k-n ? 0 : asa[se]*qsa[k-se-be];
40
41 for(int j = se; j >= k-n+2; --j){
42 pn = (pn+asa[j-1])*qsa[k-j-be+1];
43 }
44 pn=pn+tca[k-n];
45 }
46
47 kia[n] =k;
48 if(pn == 0) return []; // ????
49 tqa[n] =-tca[0]/pn;
50 }
51 terr1 = err(tp, tqa[steps], true)[0];
52 if(terr1 is not finite) throw error;
53 if(terr < eps) return [tqa[steps],terr1];
54
55 lam = (!flag_min)*lam + flag_min*terr1;
56 ats = (!flag_min)*ats + flag_min*tshift;
57 ass = (!flag_min)*ass + flag_min*sshift;
58 tph = (!flag_min)*tph + flag_min*tp;
59 stem = (!flag_min)*stem + flag_min*steps;
60 sqa = (!flag_min)*sqa + flag_min*eval(tqa);
61 kma = (!flag_min)*kma + flag_min*eval(kia)
62}
63
64void degtwoone(std::vector<std::complex<double>>& tp, int& tdeg) {
65 std::complex<double> a, b, c, d, bz;
66 bool flag_suc = true;
67 int ladi = 0;
68
69 if (tdeg == 2) {
70 a = tp[2];
71 b = -tp[1] / (static_cast<double>(2) * a);
72 c = tp[0] / a;
73 d = std::sqrt(std::pow(b, 2) - c);
74 a = b + d;
75 b -= d;
76
77 if (std::abs(a) > std::abs(b)) {
78 finroot(bz + a);
79 finroot(bz + c / a);
80 }
81 if (std::abs(a) == std::abs(b)) {
82 finroot(bz + a);
83 finroot(bz + b);
84 }
85 if (std::abs(a) < std::abs(b)) {
86 finroot(bz + b);
87 finroot(bz + c / b);
88 }
89 tdeg -= 2;
90 } else {
91 finroot(-tp[0] / tp[1] + bz);
92 tdeg -= 1;
93 }
94}
95
96std::vector<double> err(double q, double x) {
97 double la, ala;
98 la = laguerre(q, x);
99 // bool flag_lag = true;
100
101 ala = degree(q) * std::fabs(la);
102 if (ala < INFINITY) {
103 return {ala, la};
104 }
105 std::cout << "No error result" << std::endl;
106 return {INFINITY, false};
107}
108
109void minrad(){
110 flag_once = false;
111 double rmin = np.inf;
112 for(int jl=0; j < len(rl); jl++){
113 rmin = rl[jl] < rmin ? std::fabs(rl[jl]) : rmin;
114 }
115}
116
117void findroot(std::vector<double>& p, std::vecvor<double>& rootlist, double& ro, bool& flag_suc, bool& flag_fin){
118 auto nera = err(p, ro);
119 auto bof = (nera[0] < inf)*bof + 0;
120 if(flag_suc){
121 rootlist.push_back(ro);
122 }
123 if(bof != 0) flag_fin = false;
124 // nera[1] returned in maple
125 return nera[1];
126}
127
128void degtwo(double bz, std::vector<double> tp, int& tdeg, std::vector<double>& rootlist, bool flag_fin){
129 bool flag_suc = true;
130 auto a = -0.5*tp[1] + np.sqrt(b**2 - c);
131 auto b = -0.5*tp[1] - np.sqrt(b**2 - c);
132 flag_f = flag_fin;
133
134 finroot(tp, rootlist, bz + (abs(a) >= abs(b)*(a) + (abs(a) < abs(b))*(b)) );
135 finroot(tp, rootlist, bz + (abs(a) == abs(b)*(b) + (abs(a) != abs(b))*(tp[2]/( (abs(a)>abs(b))*(a) + (abs(a)<abs(b))*(b) ))));
136 tdeg -= 2;
137}
138
139void trial(int cl, int tdeg, std::vector<double>& tp,std::vector<double>& tp1, double bz, double bz1, double stepfactor,
140 double stepmin, bool& flag_suc, bool& flag_inc, bool flag_min){
141 if(tp[-1]*tp[-1] < eps4 && tp[-2]*tp[-2] > eps4){
142 auto qco = -tp[-1]/tp[-2];
143 auto ladi = err(tp, qco)[0];
144 if(ladi < eps){
145 if(flag_inc = (err(tp1, qco + bz - bz1 && cl == 2)[0] >=eps && cl==2) ? true : false) return;
146 flag_suc = true
147 deflate(qco + bz - bz1);
148 return;
149 }
150 }
151 auto diam = 1.0 + std::max(tp[:-1]);
152 auto steps = (cl == 1 || (cl==2 && flag_min))*np.ceil(stepfactor *(np.ln(diam*tdeg) + ln10n*(prec+1))) +
153 (cl >= 2 || (cl!=2 && flag_min))*(16*tdeg)
154 std::vector<double> tca(tdeg, 0);
155 auto _tp = list(reversed(tp));
156 std::vector<double> tca = _tp;
157 auto res2 = bernoullid();
158 if(flag_inc) return;
159 if(len(res2) == 2){
160 ladi = res2[1];
161 flag_suc = true;
162 deflate(res2[0]+bz-bz1);
163 }
164 else if(len(res2) == 0){
165 rad = minrad();
166 }
167 /*
168 elif cl == 2 and flag_min:
169 tqm = tqa
170 kim = kia
171 */
172}
173
174void run(double& bz, double& bzre, double& tp, int& tdeg, double& rootlist, double& stepfactor, bool flag_fin){
175 flag_lag = true;
176 if(tdeg < 3) degtwo(bz, tp, tdeg, rootlist, flag_fin);
177 else{
178 flag_suc= false;
179 flag_inc = true;
180 flag_min = false;
181 }
182
183 while(flag_inc){
184 flag_inc = false;
185 tp1 = tp;
186 bz1 = bz;
187 bz, bz1, flag_suc, flag_inc = trial(1, tp, tp1, tdeg, bz, bz1, stepfactor, flag_suc, flag_inc, flag_min);
188 tp = tp1;
189 bz = bz1;
190 }
191}
const double eps
Definition L18_or.h:10
void laguerre(std::vector< double > &poly, int deg, std::vector< std::complex< double > > &roots, std::vector< int > &conv, int itmax)
Find the roots of a polynomial using Laguerre's method.
Definition L18_or.h:274
void degtwo(double bz, std::vector< double > tp, int &tdeg, std::vector< double > &rootlist, bool flag_fin)
Definition Laguerre15m.h:128
void run(double &bz, double &bzre, double &tp, int &tdeg, double &rootlist, double &stepfactor, bool flag_fin)
Definition Laguerre15m.h:174
void minrad()
Definition Laguerre15m.h:109
std::vector< double > err(double q, double x)
Definition Laguerre15m.h:96
int tdeg
Definition Laguerre15m.h:3
void trial(int cl, int tdeg, std::vector< double > &tp, std::vector< double > &tp1, double bz, double bz1, double stepfactor, double stepmin, bool &flag_suc, bool &flag_inc, bool flag_min)
Definition Laguerre15m.h:139
void bernoullid()
Definition Laguerre15m.h:4
void degtwoone(std::vector< std::complex< double > > &tp, int &tdeg)
Definition Laguerre15m.h:64
void findroot(std::vector< double > &p, std::vecvor< double > &rootlist, double &ro, bool &flag_suc, bool &flag_fin)
Definition Laguerre15m.h:117
p2 de j *z j
Definition Laguerre15m_or.h:23
cohn_schur ra local b
Definition Laguerre15m_or.h:3
cohn_schur ra local k
Definition Laguerre15m_or.h:3