首页 > 费马小定理求素数

费马小定理求素数

/*---------------------------------------------------

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

}

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • /*判断屏幕宽高比是否为16:9*/ function isScreen16to9() {return window.screen.height / window.screen.width === 9 / 16; }...

  • /*关闭、刷新、跳转、离开当前网页前提示*/ onbeforeunload = function () {return false; };  ...

  • let json = {/**判断JSON格式*/ isJSON: function (str) {if (typeof str == "string") {try {var obj = JSON.parse(str);if (typeof obj == "object" && obj) {return true;} else {...

  •   项目结构   index.js //必须要安装否则就别想运行了❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤ //npm i body-parser -D & cnpm i express & cnpm i node-xlsx & cnp...

  • 一、递归 函数    为什么要有函数,提高代码的可读性,避免重复的代码,提高代码的复用性      在函数中能用return的不要print 1、递归的最大深度997 def foo(n):print(n)n+=1foo(n) foo(1) 递归的最大深度 2、修改递归的最大深度     由此我们可以看出,未报错之前能看到的最大数...

  • 欧拉筛又称线性筛,可以在线性的时间内筛出素数,因此在时间上要优于埃拉托斯特尼筛法。 欧拉筛是怎么做到在线性的时间内筛素数呢?先看代码。 1 int n,vis[maxn],prime[maxn],cnt; 2 for(int i=2;i<=n;++i) { 3 if(!vis[i]) prime[++cnt]...