小言_互联网的博客

牛顿二项式定理学习(广义二项式定理)

417人阅读  评论(0)

牛顿二项式定理

二项式定理

对于一个这样的式子: ( x + y ) n (x+y)^n

展开式如下:

( x + y ) n = i = 0 n ( i n ) x n i y i (x+y)^n=\sum_{i=0}^{n}{(^n_i)x^{n-i}y^{i}}

其中 ( i n ) = n ( n 1 ) . . . ( n i + 1 ) i ! (^n_i)=\frac{n(n-1)...(n-i+1)}{i!}

牛顿二项式定理

牛顿二项式定理是对二项式定理的扩展,通过牛顿二项式定理可以得到 ( x + y ) α (x+y)^\alpha

的展开式,其中 α \alpha 是任意实数。

α \alpha 为任意实数, x , y x,y 满足 0 x < y 0 \leq |x| < |y| ,有

( x + y ) α = k = 0 ( k n ) x α y α k (x+y)^{\alpha}=\sum_{k=0}^{\infty}{(^n_k)x^{\alpha}y^{\alpha-k}}

z = x / y , z < 1 z=x/y,|z| < 1 ,那么 ( x + y ) α = y α ( 1 + z ) α (x+y)^{\alpha}=y^{\alpha}(1+z)^{\alpha} ,那么等价于求

( 1 + z ) α (1+z)^{\alpha} 即可。

( 1 + z ) α = k = 0 ( k α ) z k (1+z)^{\alpha}=\sum_{k=0}^{\infty}{(^{\alpha}_k)z^{k}}

n n 为正整数,我们用 n -n 代替 α \alpha ,有

( k a ) = ( k n ) = n ( n 1 ) . . . ( n k + 1 ) k ! = ( 1 ) k ( k n + k 1 ) (^{a}_{k})=(^{-n}_{k})=\frac{-n(-n-1)...(-n-k+1)}{k!}=(-1)^k(^{n+k-1}_{k})

因此,对于 z < 1 |z|<1 有:

( 1 + z ) n = 1 ( 1 + z ) n = k = 0 ( 1 ) k ( k n + k 1 ) z k (1+z)^{-n}=\frac{1}{(1+z)^n}=\sum_{k=0}^{\infty}{(-1)^k(^{n+k-1}_k)z^{k}}

z -z 代替 z z 得:
( 1 z ) n = 1 ( 1 z ) n = k = 0 ( k n + k 1 ) z k (1-z)^{-n}=\frac{1}{(1-z)^n}=\sum_{k=0}^{\infty}{(^{n+k-1}_k)z^{k}}

n = 1 n=1 得:

( 1 + z ) 1 = 1 ( 1 + z ) = k = 0 ( 1 ) k z k (1+z)^{-1}=\frac{1}{(1+z)}=\sum_{k=0}^{\infty}{(-1)^kz^{k}}

( 1 z ) 1 = 1 ( 1 z ) = k = 0 z k (1-z)^{-1}=\frac{1}{(1-z)}=\sum_{k=0}^{\infty}{z^{k}}

利用这个式子我们就可以求任意精度的开根操作了。

例如求 20 \sqrt{20}

20 = 4 + 16 = ( 4 + 16 ) 1 2 = 4 ( 1 + 0.25 ) 1 2 \sqrt{20}=\sqrt{4+16}=(4+16)^{\frac{1}{2}}=4(1+0.25)^{\frac{1}{2}}

然后展开即可。

20 \sqrt{20} 的程序


/*******************************
Author:galaxy yr
LANG:C++
Created Time:2019年10月04日 星期五 16时15分42秒
*******************************/
#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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场