Ural 1268 Little Chu (原根)

对于两个正整数Ural 1268 Little Chu (原根),由欧拉定理可知,存在正整数Ural 1268 Little Chu (原根), 比如说欧拉函数Ural 1268 Little Chu (原根),即小于等于 m 的正整数中与 m 互质的正整数的个数,使得Ural 1268 Little Chu (原根)

由此,在Ural 1268 Little Chu (原根)时,定义Ural 1268 Little Chu (原根)对模Ural 1268 Little Chu (原根)的指数Ural 1268 Little Chu (原根)为使Ural 1268 Little Chu (原根)成立的最小的正整数Ural 1268 Little Chu (原根)。由前知Ural 1268 Little Chu (原根) 一定小于等于 Ural 1268 Little Chu (原根),若Ural 1268 Little Chu (原根),则称Ural 1268 Little Chu (原根)是模Ural 1268 Little Chu (原根)的原根

摘自*


这个题目就是要求一个质数n的最大的原根

现在的问题就是怎么求原根,如果直接暴力是 O(nlogn * 因子数),显然是不行的。。

方法:

如果q不是n的原根,那么必然存在一个t < n-1且 q^t = 1(mod n),这里我就假设q^t = 1(mod n), t肯定是整除n-1的(想想就明白)

根据裴蜀定理可知ax+by=gcd(a,b)必然有解

所以必然存在tx + (n-1)y = gcd(t, n-1),所以q^(tx) = 1 = q^( -(n-1)y + gcd(t, n-1)) = q^( gcd(t, n-1) ) ,即q^( gcd(t, n-1) ) = 1

因为t < n-1 且t 整除n-1,所以 t 至少整除 (n-1)/pi (1 <= i <=  tot)中的一个,pi为n-1的素因子

所以要判断q是不是n的原根,只需要判断 q^( (n-1)/pi ) % n 其中如果有一个等于1的话,那q就不是原根!


代码:


Ural 1268 Little Chu (原根)

上一篇:[Unity3d]水果忍者-声音和刀光的实现


下一篇:用C#创建一个混合型类