费马小定理求素数

/*---------------------------------------------------
费马小定理:如果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;
}

你可能感兴趣的:(less,Random)