// UVa 10006 - Carmichael Numbers
#include <iostream>
#include <cmath>
#include <string.h>
#define type unsigned long long
using namespace std;
bool prime[65000];
void findprimes() {
memset(prime, true, sizeof(bool) * 65000);
for (int i = 2; i < 65000; i++) {
if (prime[i]) {
for (int j = i + i; j < 65000; j += i)
prime[j] = false;
}
}
}
type M(type a, type e, type n) {
if (e == 1)
return a % n;
else {
if (e % 2 == 0)
return (type) (pow(M(a, e / 2, n) * 1.0, 2.0)) % n;
else
return (type) (pow(M(a, e / 2, n) * 1.0, 2.0)) * a % n;
}
}
int main() {
findprimes();
type n;
cin >> n;
while (n != 0) {
bool carmichael;
if (prime[n])
carmichael = false;
else {
carmichael = true;
for (type a = 2; a < n; a++) {
type mod = M(a, n, n);
if (mod != a) {
carmichael = false;
break;
}
}
}
if (carmichael)
cout << "The number " << n << " is a Carmichael number." << endl;
else
cout << n << " is normal." << endl;
cin >> n;
}
return 0;
}
Saturday, June 13, 2015
UVa 10006 - Carmichael Numbers
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment