原根

定义:设\(m > 1\),且\((a,m) = 1\),使得\(a^r \equiv 1 mod(m)\)成立的最小的\(r\),称为\(a\)对模\(m\)的阶,记为\(\delta_m(a)\)

定理:若\(m > 1\),且\((a ,m) = 1\)\(a^n \equiv 1 mod(m)\),则\(\delta_m(a)|n\)

原根

定义:设\(m\)是正整数,\(a\)是整数,若\(\delta_m(a) = \varphi(m)\),则称\(a\)为模\(m\)的一个原根

定理:如果模\(m\)有原根,那么它一共有\(\varphi(\varphi(m))\)个原根

定理:若\(g\)\(m\)的一个原根,则\(g,g^2,……,g^{\varphi(m)}\)各数对\(m\)取模的非负最小剩余就是小于\(m\)且与\(m\)互质的\(\varphi(m)\)个数的一个排列

原根存在条件

\(m = 2,4,2P^n,P^n\),这里的\(P\)是奇素数(除2以外的素数),\(n\)是正整数

求原根的方法

从2开始枚举,然后暴力判断\(g^{P - 1} \equiv 1 mod(P)\)是否只有在指数为\(P - 1\)的时候成立。

bool check(int g) {
    int tp = 1;
    for (int i = 1; i < P - 1; ++i) {
        tp = 1ll * tp * g % P;
        if (tp == 1) return 0;
    }
    return false;
}
void get() {
    int g = 2;
    for (int i = 2; ; ++i) if (check(i)) {
        g = i;
        break;
    }
}

模素数求原根的方法

首先求\(\varphi(m)\)的素幂分解式:
\[ \varphi(m) = p_1^{e_1}*p_2^{e_2}*p_3^{e_3}*·····*p_k^{e_k} \]
然后枚举\(g\),若恒满足
\[ g^{\frac{\varphi(m)}{p_i}} \ne 1 mod(m),i = 1,2,·····,k \]
\(g\)\(m\)的一个原根

转载于:https://www.cnblogs.com/zgglj-com/p/9749947.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值