与伯努利的数字相处【难度:3级】:答案1:using System;class AlongBern{ private static double bNb(int n) { if (n == 0) {return 1.0;} if (n == 1) {return -0.5;} if (n % 2 == 1) {return 0...
摘要由CSDN通过智能技术生成
与伯努利的数字相处【难度:3级】:
答案1:
using System;classAlongBern{privatestaticdoublebNb(int n){if(n ==0){return1.0;}if(n ==1){return-0.5;}if(n %2==1){return0.0;}
BFraction[] bernoulli =newBFraction[n +1];for(int m =0; m <= n;++m){
bernoulli[m]=newBFraction(1, m +1);for(int j = m; j >=1;--j){
bernoulli[j -1].subk(bernoulli[j]);
bernoulli[j -1].mulk(j);}}BFraction b = bernoulli[0];return(double)b.numerk /(double)b.denomk;}privatestaticdoublesIterative(int n,int terms){double result =0.0;int i =1;while(i <= terms){
result +=1.0/ Math.Pow(i, n);
i +=1;}return result;}privatestaticlongfactorial(int n){return(1> n)?1: n *factorial(n -1);}publicstaticdoubleSeries(int n,int nb){double pi =3.14159265358979;if(n >=0){if(n %2==1){returnsIterative(n, nb);}else{return0.5* Math.Abs(bNb(n))*(Math.Pow(2* pi, n)/factorial(n));}}else{return Math.Pow(-1,(-n))*bNb(-n +1)/(-n +1);}}}
答案2:
using System;classAlongBern{publicstaticdoubleZeta(int k,int precision =50){if(k <0)return2.0* Math.Pow(2* Math.PI, k -1)* Math.Cos(Math.PI *(1- k)*0.5)*Fact(-k)*Zeta(1- k);double sum =0;for(int n =0; n < precision; n++){doublepartial=0;for(int m =0; m <= n; m++)partial+=(m %2==0?1.0:-1.0)*Binomial(n, m)* Math.Pow(m +1,-k);
sum +=partial/ Math.Pow(2, n +1);}return sum /(1- Math.Pow(2,1- k));}publicstaticdoubleBernoulli(int k)=>(k %2==0?-1.0:1.0)* k *Zeta(1- k);publicstaticdoubleBinomial(int n,int k)=>Fact(n)/(Fact(k)*Fact(n - k));publicstaticdoubleFact(int n)=> n <=1?1: n *Fact(n -1);publicstaticdoubleSeries(int k,int nb)=> k >=2?(k %2==0?(Math.Pow(2, k -1)* Math.Pow(Math.PI, k)* Math.Abs(Bernoulli(k)))/Fact(k):Zeta(k)): k <-1?(k %2==0?1.0:-1.0)*Bernoulli(-k +1)/(-k +1.0):double.NaN;}
答案3:
using System;using System.Linq;classAlongBern{publicstaticdoubleSeries(int k,int nb){double pi =3.14159265358979;double result =0;double[] b =newdouble[]{1,-1f/2f,1f/6f,0,-1f/30f,0,1f/42f,0,-1f/30f,0,5f/66f,0,-691f/2730f,0,7f/6f,0,-3617f/510f,0,43867f/798f,0,-174611f/330f,0,6192.123188405,0,-86580.2531135531135,0,8553103f/6f,0,-27298231.06781609195};if(k >2&& k %2==1)
result = Enumerable.Range(1, nb).Sum(x =>1/ Math.Pow(x, k));if(k >=2&& k %2==0){double fact =1;for(int i =1; i <= k; i++)
fact *= i;
result =0.5* Math.Abs((double)b[k])* Math.Pow(2* pi, k)/fact;}if(k <-1){
k *=-1;
result = Math.Pow(-1, k)*(double)b[k +1]/(k +1);}return(double)result;}}
答案4:
using System;using System.Collections.Generic;publicclassAlongBern{publicstaticdoubleSeries(int k,int nb ){if( k >=2){if( k%2!=0){returnF1( k, nb );}returnF2( k );}returnF3(-k );}privatestaticdoubleF1(int k,int nb ){double sum =0;for(int i =1; i <= nb; i++){
sum +=(1/Math.Pow( i, k ));}return sum;}privatestaticdoubleF2(int k ){return1.0/2*Math.Abs(Bn( k ))*Math.Pow(2*Math.PI, k )/F( k );}privatestaticdoubleF3(int k ){return Math.Pow(-1, k )*Bn( k +1)/( k +1);}privatestaticreadonly Dictionary<int,long> FactorsTable =newDictionary<int,long>{{0,1},{1,1},{2,2},{3,6},{4,24},{5,120},{6,720},{7,5040},{8,40320},{9,362880},{10,3628800},{11,39916800},{12,479001600}};privatestaticlongF(int n ){if( n <=1){return1;}if(!FactorsTable.ContainsKey( n )){
FactorsTable [ n ]= n*F( n -1);}return FactorsTable [ n ];}privatestaticlongC(int n,int k ){if( k > n ){return0;}var coefficient =1;for(var i =1; i <= k; i++){
coefficient *= n--;
coefficient /= i;}return coefficient;}privatestaticreadonly Dictionary<int,double> BernoulliNumbers =newDictionary<int,double>{{0,1}};privatestaticdoubleBn(int n ){if(!BernoulliNumbers.ContainsKey( n )){double sum =0;for(int i =0; i <= n -1; i++){
sum +=C( n, i )*Bn( i )/( n - i +1);}
BernoulliNumbers [ n ]=1- sum;}return BernoulliNumbers [ n ];}}
答案5:
using System;classAlongBern{publicstaticdoubleZeta(int k,int precision =2000000){if(k <0)return2.0* Math.Pow(2* Math.PI, k -1)* Math.Cos(Math.PI *(1- k)*0.5)*Fact(-k)*Zeta(1- k);double sum =0;for(int n =1; n < precision; n++)
sum += Math.Pow(n,-k);return sum;}publicstaticdoubleBernoulli(int k)=>(k %2==0?-1.0:1.0)* k *Zeta(1- k);publicstaticdoubleFact(int n)=> n <=1?1: n *Fact(n -1);publicstaticdoubleSeries(int k,int nb)=> k >=2?(k %2==0?(Math.Pow(2, k -1)* Math.Pow(Math.PI, k)* Math.Abs(Bernoulli(k)))/Fact(k):Zeta(k, nb)): k <-1?(k %2==0?1.0:-1.0)*Bernoulli(-k +1)/(-k +1.0):double.NaN;}
答案6:
using System;using System.Collections.Generic;classAlongBern{publicstaticlongFactorial(int n)=>(1>n)?1: n*Factorial(n-1);publicstatic List<int>LowBern(int n){
List<int> arr =newList<int>();intvalue=1;for(int i=0; i<n;++i){
arr.Add(value);value=value*(n-i)/(i+1);}return arr;}publicstaticdoubleBernoulliNum(int n){
List<double> arr =newList<double>();
arr.Add(-0.5);double bern;for(int i=1; i<=n;++i){
bern =1;for(int j=1; j<=i;++j)
bern = bern +LowBern(i+2)[j]* arr[j-1];
bern =(-1.0/(i+2))* bern;
arr.Add(bern);}return arr[n-1];}publicstaticdoubleSeries(int k,int nb){double pi =3.14159265358979;double d =0.0;if(k>2&& k%2==1)for(int i=1; i<=nb;++i)
d = d+1.0/ Math.Pow(i,k);if(k>=2&& k%2==0){
d=1;for(int i=1; i<=k;++i)
d = d*2* pi/i;
d =(1.0/2.0)* Math.Abs(BernoulliNum(k))* d;}if(k<-1){int kk = Math.Abs(k);
d = Math.Pow(-1,kk)*BernoulliNum(kk+1)/(kk+1);}return d;}}