费马小定理求素数
/*---------------------------------------------------
費(fèi)馬小定理:如果n是一個(gè)素?cái)?shù),a是小于n的任意正整數(shù),那么a的n次方與a模n同余。
(倆個(gè)數(shù)稱為模n同余,如果它們除以n的余數(shù)相同。數(shù)a除以n的余數(shù)稱為a取模n的余數(shù),或簡(jiǎn)稱為a取模n)
condition:
?? n is a prime
?? a < n
result:
?? a^n%n == a%n
---------------------------------------------------*/
int square(int n)
{
?return n*n;
}
/*---------------------------------------------------
計(jì)算一個(gè)數(shù)的冪對(duì)另一個(gè)數(shù)取模的結(jié)果,
確定是否素?cái)?shù)所需的步數(shù)將具有θ(log n)的增長(zhǎng)階
---------------------------------------------------*/
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;
?}
}
/*---------------------------------------------------
執(zhí)行費(fèi)馬檢查需要選取位于1和n-1之間(包含這兩者)的數(shù)a,而后檢查a的n次冪取模n的余數(shù)是否等于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;
}
總結(jié)
- 上一篇: Cell select
- 下一篇: 斐波那契算法举例(iterative F