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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

逆元的求法

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 逆元的求法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

逆元:
對于a和p,若 a * inv(a) % p ≡ 1,則稱inv(a)為a%p的逆元。其中p為質數
逆元就是在mod下,不能直接除以一個數,而要乘以他的逆元
a * inv(a) = 1 (mod p)
x / a可以改成 x * inv(a) % p

文章目錄

    • 方法一.擴展歐幾里得
      • 代碼:
    • 方法二.費馬小定理+歐拉定理
      • 代碼:
    • 方法三:遞推求逆元
      • 代碼

方法一.擴展歐幾里得

a * inv(a) = 1 (mod p)
可以變形成 a * inv(a) +k * p = 1(前提是a和p要互素)
可以用擴歐的公式來計算
時間復雜度:O(logn)
適用范圍:只要存在逆元即可求,適用于個數不多但是mod很大的時候,也是最常見的一種求逆元的方法。

代碼:

ll exgcd(ll a,ll b,ll &x,ll &y)//擴展歐幾里得算法 {if(b==0){x=1;y=0;return a; //到達遞歸邊界開始向上一層返回}ll gcd=exgcd(b,a%b,x,y);ll y1=y; //把x y變成上一層的ll x1=x;y=x1-(a/b)*y1;x=y1;return gcd; //得到a b的最大公因數 } ll inv(ll a,ll mod){ll x,y;ll gcd=exgcd(a,mod,x,y);if(gcd!=1)return -1;else return (x+mod)%mod; }

方法二.費馬小定理+歐拉定理

費馬小定理:假如p是質數,且gcd(a,p)=1,那么 a(p-1) ≡ 1(mod p),進一步可以推出ap-2 * a ≡ 1 (mod p)
ap-2就是a在mod p意義下的逆元
歐拉函數:aφ(n)≡1 (mod n) ,其中 gcd(a,n)=1
若n為素數,φ(n)=n-1
時間復雜度 O(log mod)
適用范圍:在mod是素數的時候使用,比擴歐快

代碼:

ll poww(ll a,ll b,ll mod){ll ans=1;ll base=a;while(b){if(b&1)ans=ans*base%mod;base=base*base%mod;b>>=1;}return ans%mod; } ll inv(ll a,ll mod){return poww(a,mod-2,mod); }

方法三:遞推求逆元

時間復雜度為O(n)
使用條件:mod為不是很大的素數,且需要多次調用

代碼

long long inv[maxn]; void init(long long n,long long p) {inv[1]=1;for(int i=2;i<=n;i++){inv[i]=((p-p/i)*inv[p%i]%p);} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的逆元的求法的全部內容,希望文章能夠幫你解決所遇到的問題。

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