牛顿二项式定理
二项式定理
对于一个这样的式子:
(x+y)n
展开式如下:
(x+y)n=i=0∑n(in)xn−iyi
其中
(in)=i!n(n−1)...(n−i+1)
牛顿二项式定理
牛顿二项式定理是对二项式定理的扩展,通过牛顿二项式定理可以得到
(x+y)α
的展开式,其中
α是任意实数。
设
α为任意实数,
x,y满足
0≤∣x∣<∣y∣,有
(x+y)α=k=0∑∞(kn)xαyα−k
设
z=x/y,∣z∣<1,那么
(x+y)α=yα(1+z)α,那么等价于求
(1+z)α即可。
(1+z)α=k=0∑∞(kα)zk
设
n为正整数,我们用
−n代替
α,有
(ka)=(k−n)=k!−n(−n−1)...(−n−k+1)=(−1)k(kn+k−1)
因此,对于
∣z∣<1有:
(1+z)−n=(1+z)n1=k=0∑∞(−1)k(kn+k−1)zk
用
−z代替
z得:
(1−z)−n=(1−z)n1=k=0∑∞(kn+k−1)zk
若
n=1得:
(1+z)−1=(1+z)1=k=0∑∞(−1)kzk
(1−z)−1=(1−z)1=k=0∑∞zk
利用这个式子我们就可以求任意精度的开根操作了。
例如求
20
20
=4+16
=(4+16)21=4(1+0.25)21
然后展开即可。
求
20
的程序
#include<iostream>
const int maxn=3005;
long double x,c[maxn][maxn];
long double C(double a,double k)
{
long double res=1;
for(double i=a;i>=a-k+1;i--) res*=i;
for(double i=1;i<=k;i++)
res/=i;
return res;
}
long double solve()
{
long double x=1.25,a=0.5,z=x-1;
if(z<0)z=-z;
long double s=1,ans=0;
for(int k=0;k<=170;k++)
{
ans+=C(a,k)*s;
s*=z;
}
return 4*ans;
}
int main()
{
std::cout<<solve()<<std::endl;
return 0;
}
转载:
https://blog.csdn.net/Galaxy_yr/article/details/102080510