" , , , , Carmichael 560, ", - . 561 (560 ) . , , .
n
Carmichael , , a
1 < a < n
, n
, a^(n-1) = 1 (mod n)
. , :
1) , a
n
2) a^(n-1) (mod n)
- . , gcd(a,b) = gcd(b,a%b)
gcd(a,0) = a
. C :
unsigned int gcd(unsigned int a, unsigned int b){
return b == 0? a : gcd(b, a%b);
}
- , a^k (mod n)
, - a^k
n
. , (mod n
) . , , , a^10 = (a^5)^2
a^11 = (a^5)^2 * a
. C:
unsigned int modexp(unsigned int a, unsigned int p, unsigned int n){
unsigned long long b;
switch(p){
case 0:
return 1;
case 1:
return a%n;
default:
b = modexp(a,p/2,n);
b = (b*b) % n;
if(p%2 == 1) b = (b*a) % n;
return b;
}
}
unsigned long long
b*b
.
, n
Carmichael, , n
, 0
. , a
, 2
n-1
. , gcd(a,n) == 1
, n
, a
, n
gcd(a,n) > 1
). , , a
, , a
, 0
. a
gcd(a,n) == 1
a^(n-1) (mod n)
. - 1, 0
. a
n
0
, Carmichael, return 1. :
int is_carmichael(unsigned int n){
int a,s;
int factor_found = 0;
if (n%2 == 0) return 0;
s = sqrt(n);
a = 2;
while(a < n){
if(a > s && !factor_found){
return 0;
}
if(gcd(a,n) > 1){
factor_found = 1;
}
else{
if(modexp(a,n-1,n) != 1){
return 0;
}
}
a++;
}
return 1;
}
:
int main(void){
unsigned int n;
for(n = 2; n < 100000; n ++){
if(is_carmichael(n)) printf("%u\n",n);
}
return 0;
}
:
C:\Programs>gcc carmichael.c
C:\Programs>a
561
1105
1729
2465
2821
6601
8911
10585
15841
29341
41041
46657
52633
62745
63973
75361
2 .
, , , . , , , Wikipedia entry .