coeffs.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "coeffs.hpp"
  2. //*****************************
  3. //* Defintion of externs data *
  4. //****************************
  5. Reel coeffs[num_coeffs];
  6. fmpz_poly_t coeffs_poly[num_coeffs];
  7. Int coeffs_den;
  8. //******************
  9. //* compute_coeffs *
  10. //******************
  11. void compute_coeffs(){
  12. for(size_t i=0;i<num_coeffs;++i){
  13. fmpz_poly_init(coeffs_poly[i]);
  14. }
  15. CoeffAnalytic ca[num_coeffs];
  16. ca[pos(0,0)]={0,0}; //C_(0,0)=0
  17. ca[pos(0,1)]={-1,0}; //C_(1,0)=-1
  18. //Compute C_(i,i)
  19. Rationnal r=0;
  20. for(size_t i=1;i<=max_ind_coeffs;++i){
  21. Rationnal t(1,2*i-1);
  22. r=r+t;
  23. ca[pos(i,i)]={0,-4*r};
  24. }
  25. coeffs_den=ca[pos(max_ind_coeffs,max_ind_coeffs)].b.denominator();
  26. for(size_t j=2;j<=max_ind_coeffs;++j){
  27. //C(0,j)=4*C(0,j-1)-C(0,j-2)-2*C(1,j-1)
  28. ca[pos(0,j)].a=4*ca[pos(0,j-1)].a-ca[pos(0,j-2)].a-2*ca[pos(1,j-1)].a;
  29. ca[pos(0,j)].b=4*ca[pos(0,j-1)].b-ca[pos(0,j-2)].b-2*ca[pos(1,j-1)].b;
  30. for(size_t i=1;i<=j-2;++i){
  31. //C(i,j)=4*C(i,j-1)-C(i,j-2)-C(i-1,j-1)-C(i+1,j-1)
  32. ca[pos(i,j)].a=4*ca[pos(i,j-1)].a-ca[pos(i,j-2)].a-ca[pos(i-1,j-1)].a-ca[pos(i+1,j-1)].a;
  33. ca[pos(i,j)].b=4*ca[pos(i,j-1)].b-ca[pos(i,j-2)].b-ca[pos(i-1,j-1)].b-ca[pos(i+1,j-1)].b;
  34. }
  35. //C(j-1,j)=2*C(j-1,j-1)-C(j-2,j-1)
  36. ca[pos(j-1,j)].a=2*ca[pos(j-1,j-1)].a-ca[pos(j-2,j-1)].a;
  37. ca[pos(j-1,j)].b=2*ca[pos(j-1,j-1)].b-ca[pos(j-2,j-1)].b;
  38. }
  39. Rationnal fpii(1725033,5419351);
  40. Reel epii=2.275957200481571e-15; //epii=1/pi-1/fpii
  41. for(size_t j=0;j<=max_ind_coeffs;++j){
  42. for(size_t i=0;i<=j;++i){
  43. size_t ind=pos(i,j);
  44. Rationnal f=ca[ind].a+fpii*ca[ind].b;
  45. coeffs[pos(i,j)]=(Reel)f+(Reel)ca[ind].b*epii;
  46. }
  47. }
  48. for(size_t i=0;i<num_coeffs;++i){
  49. fmpz_poly_set_coeff_si(coeffs_poly[i],0,
  50. (ca[i].a.numerator()*coeffs_den)/ca[i].a.denominator());
  51. fmpz_poly_set_coeff_si(coeffs_poly[i],1,
  52. (ca[i].b.numerator()*coeffs_den)/ca[i].b.denominator());
  53. }
  54. }