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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数学--数论--原根(循环群生成元)

發(fā)布時間:2023/12/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数学--数论--原根(循环群生成元) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

突然今天,我想不起什么是原根來了,查了一下定義,哎~這貨不是離散數(shù)學(xué),循環(huán)群生成元嗎??不是<a+>而是<a?>是乘法而不是加法<a_+>而是<a_*>是乘法而不是加法<a+?><a??>
嘛玩意是原根:?

對于素數(shù) p,如果存在一個正整數(shù) 1<a<p,使得 a1,a2,…,ap?1 模 p 的值取遍 1,2,…,p?1 的所有整數(shù),稱 a 是 p 的一個原根(primitive root),其實就是循環(huán)群的生成元。

如果aj≡ai(modp),則i≡j(modp?1)。這里有兩個例子:如果 aj≡ai(mod p),則 i≡j(mod p?1)。這里有兩個例子:ajai(modp)ij(modp?1)

5是7的原根,因為5–>3–>1–>6–>4–>2–>0,然后開始循環(huán)
2不是7的原根,因為2–>4–>1–>2–>4…,過早的循環(huán)了

說人話:好的

如果g是P的原根,就是(gP?1)≡1(modP)(g^P-1) ≡1 (mod P)(gP?1)1(modP)當(dāng)且僅當(dāng)指數(shù)為P-1的時候成立.(這里P是素數(shù)).
即 設(shè)m是正整數(shù),a是整數(shù),若a模m的階等于φ(m),則稱a為模m的一個原根。
φ(m):這貨是歐拉函數(shù)

定理:

定理一:
設(shè)p是奇素數(shù),則模p的原根存在; [3]
定理二:
設(shè)g是模p的原根,則g或者g+p是模的原根;
定理三:
設(shè)p是奇素數(shù),則對任意,模的原根存在;
定理四:
設(shè)1,則g是模的一個原根,則g與g+中的奇數(shù)是模2的一個原根。

性質(zhì):

性質(zhì)一:
對于任意正整數(shù)a,m,如果(a,m) = 1,存在最小的正整數(shù) d 滿足a^d≡1(mod m),則有 d 整除 φ(m),因此Ordm(a)整除φ(m)。這里的d被稱為a模m的階,記為Ordm(a)。
 例如:求3模7的階時,我們僅需要驗證 3 的 1 、2、3 和 6 次方模 7 的余數(shù)即可。
19的原根有2,2-4-8-16-13-7-14-9-。。。。
19的原根就一定有4, 4-16-7-9-。。。。。
有8,16所以也就是說如果一個數(shù)的原根沒有k也就不存在k的冪。

性質(zhì)二:
記δ = Ordm(a),則a1,……a(δ-1)模 m 兩兩不同余。因此當(dāng)a是模m的原根時,a0a1,……a(δ-1)構(gòu)成模 m 的簡化剩余系。
性質(zhì)三:
模m有原根的充要條件是
m=1,2,4,p,2?p,pn,2?pn其中p是奇質(zhì)數(shù),n是任意正整數(shù)。m= 1,2,4,p,2*p,p^n,2*p^n其中p是奇質(zhì)數(shù),n是任意正整數(shù)。m=1,2,4,p,2?p,pn,2?pnp質(zhì)數(shù)n數(shù)

性質(zhì)四:
對正整數(shù)(a,m) = 1,如果 a 是模 m 的原根,那么 a 是整數(shù)模n乘法群(即加法群 Z/mZ的可逆元,也就是所有與 m 互素的正整數(shù)構(gòu)成的等價類構(gòu)成的乘法群)Zn的一個生成元。由于Zn有 φ(m)個元素,而它的生成元的個數(shù)就是它的可逆元個數(shù),即 φ(φ(m))個,因此當(dāng)模m有原根時,它有φ(φ(m))個原根。
模m有原根的充要條件:

m=2 m=4 m=P^a m=2*P^a

怎么求?

我是笨逼枚舉

  • 將P-1進行質(zhì)因數(shù)分解
  • 枚舉i,并判斷對于每個i是否都有(可以應(yīng)用快速冪)
    第一個符合條件的i就是P的最小原根
  • 對于合數(shù),只要將2.中的p?1替換成φ(p)即可.對于合數(shù),只要將 2. 中的p-1替換成φ(p)即可.數(shù),2.p?1φ(p).

    #include<cstdio> #include<cmath> inline int phi(int n) {int zc=n,all=sqrt(n);for(int i=2;i<=all;i++){if(n%i!=0)continue;zc=zc/i*(i-1);while(n%i==0)n/=i;}if(n>1)zc=zc/n*(n-1);return zc; } inline int pow(int x,const int y,const int mod) {int res=1;for(int i=1;i<=y;i<<=1,x=x*x%mod)if(i&y)res=res*x%mod;return res; } inline int G(const int m) {const int PHI=phi(m);for(int g=2;;g++){bool fla=1;if(pow(g,PHI,m)!=1)continue;for(int i=1;i<PHI;i++)if(pow(g,i,m)==1){fla=0;break;}if(fla)return g;} } int m,g; int main() {scanf("%d",&m);g=G(m);printf("%d",g);return 0; }

    在上面的代碼中,容易發(fā)現(xiàn),枚舉的i并不是每個每個都有用的, 由性質(zhì)1可得 枚舉i只需要枚舉φ(m)的因數(shù)就好了

    #include<cstdio> #include<cmath> inline int phi(int n) {int zc=n,all=sqrt(n);for(int i=2;i<=all;i++){if(n%i!=0)continue;zc=zc/i*(i-1);while(n%i==0)n/=i;}if(n>1)zc=zc/n*(n-1);return zc; } inline int pow(int x,const int y,const int mod) {int res=1;for(int i=1;i<=y;i<<=1,x=(long long)x*x%mod)if(i&y)res=(long long)res*x%mod;return res; } int q[200001]; inline int G(const int m) {const int PHI=phi(m);q[0]=0;for(int i=2;i<PHI;i++)if(PHI%i==0)q[++q[0]]=i;for(int g=2;;g++){bool fla=1;if(pow(g,PHI,m)!=1)continue;for(int i=1;i<=q[0];i++)if(pow(g,q[i],m)==1){fla=0;break;}if(fla)return g;} } int m,g; int main() {scanf("%d",&m);g=G(m);printf("%d",g);return 0; }

    最快的代碼:

    #include<cstdio> #include<cmath> inline int phi(int n) {int zc=n,all=sqrt(n);for(int i=2;i<=all;i++){if(n%i!=0)continue;zc=zc/i*(i-1);while(n%i==0)n/=i;}if(n>1)zc=zc/n*(n-1);return zc; } inline int pow(int x,const int y,const int mod) {int res=1;for(int i=1;i<=y;i<<=1,x=(long long)x*x%mod)if(i&y)res=(long long)res*x%mod;return res; } int q[100001]; inline int G(const int m) {const int PHI=phi(m);q[0]=0;const int limit=sqrt(PHI);int zc=PHI;for(int i=2;i<=limit;i++)if(zc%i==0){q[++q[0]]=PHI/i;while(zc%i==0)zc/=i;}if(zc>1)zc=q[++q[0]]=PHI/zc;for(int g=2;;g++){bool fla=1;if(pow(g,PHI,m)!=1)continue;for(int i=1;i<=q[0];i++)if(pow(g,q[i],m)==1){fla=0;break;}if(fla)return g;} } int m,g; int main() {scanf("%d",&m);g=G(m);printf("%d",g);return 0; }

    代碼怕寫錯,參考了一下。

    總結(jié)

    以上是生活随笔為你收集整理的数学--数论--原根(循环群生成元)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。