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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

拓展欧几里得模板/求逆元模板(java)

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拓展欧几里得模板/求逆元模板(java) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

拓展歐幾里得模板
參考:哈爾濱理工大學ACM培訓資料匯編/ACM-ICPC培訓資料匯編*
基本原理 :設 a 和 b 不全為 0,則存在整數 x,y 使得 xa yb=gcd(a,b)=c
對于輾轉相除法的最后一項 此時 b=0,則 gcd(a,b)=1a 0b,(這個a,b是經過gcd的最后一項a,b)

  • 因為gcd(a,b)=gcd(b,a%b)
  • 則有x *a y *b=x1 *b y1 * (a%b) 將等式右邊變形,
    b *x1 (a%b) *y1=b *x1 (a-(a/b) *b) *y1=a *y1 b *(x1-(a/b) *y1)
  • 則,x=y1,y=x1-(a/b) *y1 則可由后向前迭代得到 x,y
  • 解題思路 對于擴展歐幾里德定理的題,一般都需要進行一定的推導之后得到一個形式為 xa yb=c 的方程,然后根據 c 確定解是否存在,如果 c 可以被 gcd(a,b)整除,那么方程有 解,否則方程無解。而且所得的解是不唯一的,對于一組解 x0,y0 則其所有解可以表示為 x=x0 b/gcd(a,b)*t,y=y0-a/gcd(a,b)*t,t=0, 1, 2……一般會要求找出 x 或者 y 的最小正整數 解,這個時候需要做一些調整。
  • 總的來說。遞歸是一來一回的過程,在gcd中,我們只用到了去的過程,求的最大公約數,而在exgcd中,我們發現了在來的過程中,某些數按照一定的規則變化,可以得到我們想要的結果而已。
static long x=0,y=0; ... static long extgcd(long a,long b){if(b==0) {x=1;y=0;return a;}long ans=extgcd(b, a%b);long team=x;x=y;y=team-a/b*y;return ans;}

求逆元:
從拓展歐幾里得中知道可以求ax by=c,一般是解決這類問題
當a,b互質時候。c一定等于1.因為gcd(a,b)=1,c必須被gcd整除,那么如果有解一定是1.
那么ax by=1.
求逆元一般形式(求a關于1mod m的逆元)
ax≡1 (mod m). x就是所求的逆元
變形為 ax bm=1
這樣就可以運用拓展歐幾里得(但是x要大于0處理)

static long x=0;static long y=0;//全局變量......long q=tgcd(a,b);// long x1=x;if(1%q!=0) {out.println("Not Exist");}else {while(x<=0){//x*a y*b=1 要求x>0這樣并且要求x最小,那么這樣操作就相當于 ab-ab操作。剛開始還沒明白x =b;y-=a;}system.out.println(x);}//static long tgcd(long a,long b){if(b==0) {x=1;y=0;return a;}long ans=tgcd(b,a%b);long team=x;x=y;y=team-a/b*y;// System.out.println(x);return ans;}

還有用小費馬可以求逆元,就不介紹了。

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的拓展欧几里得模板/求逆元模板(java)的全部內容,希望文章能夠幫你解決所遇到的問題。

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