题目
求最小的 (x>0) 使得 (2^x equiv 1(mod n))。
思路
当 (n=1) 时,任何数模 (1) 都是零,不符合条件。
当 (n) 是偶数时,因为 (2^x) 为偶数,所以不符合条件。
当 (n) 不是 (1) 也不是偶数的时,(2) 和 (n) 互质,根据欧拉定理 (2^{varphi(n)}equiv1(mod n)),所以 (varphi(n)) 一定是符合条件的,但是不一定是最小的,从 (1simvarphi(n)) 枚举找到最小的符合条件的。
Code
#include <cmath>
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
int n, pn;
int euler_phi(int x) {
int ans = x, sqrn = (int)sqrt(x * 1.0 + 0.5);
for (int i = 2; i <= sqrn; ++i) {
if (x % i == 0) {
ans = ans / i * (i - 1);
while (x % i == 0) x /= i;
}
}
if (x > 1) ans = ans / x * (x - 1);
return ans;
}
int qpow(int b) {
int ans = 1, base = 2;
while (b) {
if (b & 1) ans = 1ll * ans * base % n;
base = 1ll * base * base % n;
b >>= 1;
}
return ans % n;
}
int main() {
while (scanf("%d", &n) != EOF && n) {
if (!(n & 1) || n == 1) {
printf("2^? mod %d = 1
", n);
}
else {
pn = euler_phi(n);
for (int i = 1; i <= pn; ++i) {
if (qpow(i) == 1) {
printf("2^%d mod %d = 1
", i, n);
break;
}
}
}
}
return 0;
}