佩尔方程


是平方数时,方程无解,当为非平方数时无穷解.
若得到该方程的最小解,可有递推方程得到.


求最小解用连分数

ll a[200000];
bool pell(ll D,ll &x,ll &y){
    ll m=(ll)sqrt(0.5+D);double sq=sqrt(D);
    if(m*m==D)return false;
    int i=0;a[i++]=m;ll b=m,c=1;
    double tmp;
    do{
        c=(D-b*b)/c;  tmp=(sq+b)/c;
        a[i++]=(ll)(floor(tmp));b=a[i-1]*c-b;
    }while(a[i-1]!=2LL*a[0]);
    ll p=1,q=0;
    for(int j=i-2;j>=0;j--){
        ll t=p;p=q+p*a[j];q=t;
    }
    if((i-1)%2==0)x=p,y=q;
    else x=2LL*p*p+1,y=2LL*p*q;
    return true;
}
全部评论

相关推荐

11-03 18:50
门头沟学院 Java
迷茫的大四🐶:问就是马上到,一周五天,6个月以上,全国可飞
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务