/*---------------------------------------------------
费马小定理:如果n是一个素数,a是小于n的任意正整数,那么a的n次方与a模n同余。
(俩个数称为模n同余,如果它们除以n的余数相同。数a除以n的余数称为a取模n的余数,或简称为a取模n)
condition:
n is a prime
a < n
result:
a^n%n == a%n
---------------------------------------------------*/
int square(int n)
{
return n*n;
}
/*---------------------------------------------------
计算一个数的幂对另一个数取模的结果,
确定是否素数所需的步数将具有θ(log n)的增长阶
---------------------------------------------------*/
int expmod(int base, int exp, int m)
{
if (0 == base)
{
return 1;
}
else if (0 == exp%2) /*exp is even*/
{
return square( expmod(base, exp/2, m) ) % m;
}
else
{
return (base * expmod(base, exp-1, m)) %m;
}
}
/*---------------------------------------------------
执行费马检查需要选取位于1和n-1之间(包含这两者)的数a,而后检查a的n次幂取模n的余数是否等于a.
---------------------------------------------------*/
bool fermat_test(int n)
{
int a = rand() % n; /*a random int, less than n*/
if( a == expmod(a, n, n) )
{
return TRUE;
}
else
{
return FALSE;
}
}
bool fermat_prime(int n, int times)
{
if (0 == times)
{
return TRUE;
}
else if( fermat_test(n) )
{
return fermat_prime(n, times-1);
}
else
{
return FALSE;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
bool b = is_prime(17);
b = is_prime(88);
b = fermat_prime(31, 5);
return 0;
}