coefficients.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include "coefficients.hpp"
  2. Coefficients::Coefficients(){
  3. coeffs=new mpfr_t[ncoeffs];
  4. for(size_t i=0;i<ncoeffs;++i) mpfr_init2(coeffs[i],4096);
  5. mpfr_t a,b,c;
  6. mpfr_init2(a,prec);
  7. mpfr_init2(b,prec);
  8. mpfr_init2(c,prec);
  9. //C(0,0)=0
  10. mpfr_set_zero(coeffs[pos(0,0)],0);
  11. //C(1,0)=-1
  12. mpfr_set_si(coeffs[pos(1,0)],-1,MPFR_RNDN);
  13. mpfr_set_si(a,-4,MPFR_RNDN);//a=-4
  14. mpfr_const_pi(b,MPFR_RNDN);//b=pi
  15. mpfr_div(a,a,b,MPFR_RNDN);//a=-4/pi
  16. mpfr_set_zero(b,0);//b=0
  17. for(size_t i=1;i<=imax;++i){
  18. mpfr_set_ui(c,2*i-1,MPFR_RNDN);//c=2i-1
  19. mpfr_ui_div(c,1,c,MPFR_RNDN);//c=1/(2i-1)
  20. mpfr_add(b,b,c,MPFR_RNDN);// b=sum(1/(2i-1)
  21. mpfr_mul(coeffs[pos(i,i)],a,b,MPFR_RNDN);
  22. }
  23. for(size_t j=2;j<=imax;++j){
  24. //C(0,j)=4*C(0,j-1)-C(0,j-2)-2*C(1,j-1)
  25. mpfr_mul_ui(a,coeffs[pos(0,j-1)],4,MPFR_RNDN);//a=4*C(0,j-1)
  26. mpfr_sub(a,a,coeffs[pos(0,j-2)],MPFR_RNDN);//a=4*C(0,j-1)-C(0,j-2)
  27. mpfr_mul_ui(b,coeffs[pos(1,j-1)],2,MPFR_RNDN);//b=2*C(1,j-1)
  28. mpfr_sub(coeffs[pos(0,j)],a,b,MPFR_RNDN);
  29. for(size_t i=1;i<=j-2;++i){
  30. //C(i,j)=4*C(i,j-1)-C(i,j-2)-C(i-1,j-1)-C(i+1,j-1)
  31. mpfr_mul_ui(a,coeffs[pos(i,j-1)],4,MPFR_RNDN);//a=4*C(i,j-1)
  32. mpfr_sub(a,a,coeffs[pos(i,j-2)],MPFR_RNDN);//a=4*C(i,j-1)-C(i,j-2)
  33. mpfr_sub(a,a,coeffs[pos(i-1,j-1)],MPFR_RNDN);//a=4*C(i,j-1)-C(i,j-2)-C(i-1,j-1)
  34. mpfr_sub(coeffs[pos(i,j)],a,coeffs[pos(i+1,j-1)],MPFR_RNDN);
  35. }
  36. //C(j-1,j)=2*C(j-1,j-1)-C(j-2,j-1)
  37. mpfr_mul_ui(a,coeffs[pos(j-1,j-1)],2,MPFR_RNDN);//a=2*C(j-1,j-1)
  38. mpfr_sub(coeffs[pos(j-1,j)],a,coeffs[pos(j-2,j-1)],MPFR_RNDN);
  39. }
  40. mpfr_clear(a);
  41. mpfr_clear(b);
  42. mpfr_clear(c);
  43. }