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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数论逆元

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

文章目錄

      • 1 什么是逆元
      • 2 存在逆元的條件是什么
      • 3 怎樣求一個數的逆元
        • 1.[ 歐幾里得擴展]
        • 2. 費馬小定理 (最常用)
      • 4 擴展(常用)
        • 1. 線性逆元(常用)
        • 2 快速階乘逆元(常用)

逆元是數論之中的一個重要概念
參考博客 ACdreamer
參考書籍 《高中數學 選修 4-6》

1 什么是逆元

2 存在逆元的條件是什么

3 怎樣求一個數的逆元

1.[ 歐幾里得擴展]

不懂的點這里
a?b+n?t=1a*b + n *t = 1a?b+n?t=1

long long ex_gcd(long long a,long long b,long long &x,long long &y) {if(b == 0){x = 1;y = 0;return a;}long long m = ex_gcd(b,a%b,y,x);y -= a/b * x;return m; } int main() {long long a,b,x,y;cin>>a>>b; //求a 關于b的逆元if(ex_gcd(a,b,x,y)==1)cout<<(x%b+b)%b<<endl;elsecout<<"None"<<endl;return 0; }

2. 費馬小定理 (最常用)

  • 如果n 是素數,費馬小定理 a(n?1)=1(modn)a^{(n-1) }= 1 \ (mod \ n)a(n?1)=1?(mod?n),那么a關于n的逆元就 是a(n?2)a^{(n-2)}a(n?2)
long long qpow(long long a,long long b,long long m)//快速冪 {long long ans = 1;a %= m;while(b > 0){if(b & 1)ans = (ans * a) % m;a = a * a % m;b >>= 1;}return ans; } long long Fermat(long long a,long long p)//前提p是質數 {return qpow(a,p-2,p); }
  • 如果n 不是素數,利用歐拉定理同理
long long Euler(long long n)//求一個數的歐拉值 {if(n == 1)return 1;long long ans = n;for(int i = 2;i * i <= n; ++i){if(n % i== 0){while(n % i == 0)n /= i;ans = ans/i * (i-1);}}if(n != 1)ans = ans/n*(n-1);return ans;} long long Euler_to_invers(long long a,long long b)// {return qpow(a,Euler(b)-1,b); }

4 擴展(常用)

1. 線性逆元(常用)

如果p是一個奇質數,則可以在o(n)時間內求出所有關于同余系關于p的逆元
證明如下
對p進行帶余除法,求i的逆元
p=i?k+t(0&lt;t&lt;i)p = i * k + t \ ( 0 &lt; t &lt; i)p=i?k+t?(0<t<i)
等式兩邊同時對關于p取模
于是 t=?i?k(modp)t = -i * k ( mod \ p)t=?i?k(mod?p)
等式兩邊同時乘以 inv(i)?inv(t)inv(i) * inv(t)inv(i)?inv(t)
inv(i)=?k?inv(t)(modp)inv(i) = -k * inv(t) ( mod\ p)inv(i)=?k?inv(t)(mod?p)
inv(i)=(p?k?inv(t))(modp)inv(i) = (p - k* inv(t)\ ) (mod\ p)inv(i)=(p?k?inv(t)?)(mod?p)
inv(i)=(p?p/i?inv(p%i))(modp)inv(i) = (p - p \ / \ i * inv(p\ \% \ i ) ) (mod \ p)inv(i)=(p?p?/?i?inv(p?%?i))(mod?p)
這樣就可以用一個數組存儲關于p的所有逆元

int inv[10000];int p;cin>>p;inv[1] = 1;for(int i = 2;i < p; ++i){inv[i] = (p - p/i*inv[p%i]%p)%p;}for(int i = 1;i < p; ++i)cout<<inv[i]<<" ";cout<<endl;for(int i = 1;i < p; ++i)cout<<i * inv[i] % p<<" ";

2 快速階乘逆元(常用)

const int maxn = 1e5+10; long long fac[maxn],invfac[maxn]; void init(int n){fac[0] = 1;for(int i = 1;i <= n; ++i) fac[i] = fac[i-1]*i%mod;invfac[n] = qpow(fac[n],mod-2);for(int i = n-1;i >= 0; --i) invfac[i] = invfac[i+1]*(i+1)%mod; }

總結

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

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