日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数论 —— 佩尔方程与连分数

發布時間:2025/3/17 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数论 —— 佩尔方程与连分数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【概述】

連分數是一種特殊的繁分數,其形式為:??,通常記為:,其中? 和 ?稱為連分數多項式,對于任意的 a 均為一次式,它們的比值稱為第 n 個漸進值漸進分數。

佩爾(Pell)方程是一種不定二次方程,其與連分數,二次型,代數論等有著重要的聯系。

其形式為:,其中 d?不為非平方數

【佩爾方程迭代公式】

定義:設 p、q 為整數,且滿足?,則稱??給出該方程的解

推論:

設??給出方程??的解

則:?給出方程??的解,其中?

取?,則有佩爾方程??

若佩爾方程的最小特解為?,故有迭代公式:

將迭代公式寫為矩陣的形式,有:,可以通過矩陣快速冪找出第 k 大的解

【連分數求解佩爾方程】

對于連分數 ?的漸進值來講,有著遞歸關系式:

通過數學歸納法,可得到關系式:

定義:對于正整數 p、q,若有?,則比值??必為 a 的一個漸近值

由此可得:佩爾方程的全部根的集合為?

由佩爾方程的迭代公式可得出佩爾方程的最小解

即:

【模版】

1.暴力尋找最小解

int x[N],y[N]; void pell(int &a,int &b,int d){//暴力尋找pell方程最小解b=1;while(true){a=(LL)sqrt(d*b*b+1);if(a*a-d*b*b==1)break;b++;} } int main(){int d;while(scanf("%d",&d)!=EOF){int m=(int)sqrt((double)d);if(m*m==d){//d不能為完全平方數cout<<"No Solution"<<endl;continue;}int a=0,b=0;pell(a,b,d);//暴力找到最小解cout<<a<<" "<<b<<endl;}return 0; }

2.迭代公式求前 n 個解

使用迭代公式求解 pell 方程的前 n 個解時,應先用暴力尋找到最小解,然后再套用迭代公式求出前 n 個解,由于 pell 方程相鄰兩解之間的差值較大,n 一般很小

int x[N],y[N]; void pell(int &a,int &b,int d){//暴力尋找pell方程最小解b=1;while(true){a=(LL)sqrt(d*b*b+1);if(a*a-d*b*b==1)break;b++;} } int main(){int d;while(scanf("%d",&d)!=EOF){int m=(int)sqrt((double)d);if(m*m==d){//d不能為完全平方數cout<<"No Solution"<<endl;continue;}int a=0,b=0;pell(a,b,d);//暴力找到最小解x[1]=a,y[1]=b;//第一組解for(int i=2;i<=10;i++){//遞推公式x[i]=x[i-1]*x[1]+2*y[i-1]*y[1];y[i]=x[i-1]*y[1]+y[i-1]*x[1];}for(int i=1;i<=10;i++)cout<<x[i]<<" "<<y[i]<<endl;}return 0; }

3.連分數法

當要求 pell 方程的最小解時,暴力可能會 TLE,此時可以使用連分數法,其關鍵是計算連分數的展開

int a[20000]; bool pell(int &x,int &y,int d){int m=(int)sqrt((double)d);if(m*m==d)//d不能為完全平方數return false;//將d以連分數形式存儲int num=0;//連分數數位double sq=sqrt(d);//d的高精度根,相當于r0a[num++]=m;//存儲整數部分int b=m;//當前整數部分int c=1;//連分數最終展開時的分母double temp;//連分數展開時的每一項do{c=(d-b*b)/c;temp=(sq+b)/c;a[num++]=(int)(floor(temp));b=a[num-1]*c-b;}while(a[num-1]!=2*a[0]);//當有一位等于整數兩倍時結束//將連分數形式化為分子分母形式,即求p、q兩個值int p=1,q=0;for(int i=num-2;i>=0;i--){int temp=p;p=q+p*a[i];q=temp;}if((num-1)%2){//連分數長度為奇數時x=2*p*p+1;y=2*p*q;}else{//連分數長度為偶數時x=p;y=q;}return true; } int main(){int d;while(scanf("%d",&d)!=EOF){int x,y;if(pell(x,y,d))cout<<x<<" "<<y<<endl;elsecout<<"No Solution"<<endl;}return 0; }

【例題】

  • Street Numbers(POJ-1320)(佩爾方程):點擊這里
  • Square Number(HDU-2281)(佩爾方程):點擊這里

總結

以上是生活随笔為你收集整理的数论 —— 佩尔方程与连分数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。