如何判断质数?

质数,又称“素数”,质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

现在,ljn教大家如何用程序判断质数。

1.一般,大家在程序中判断质数都是写一个函数,函数中循环从2到这个数的算数平方根枚举,看看这个数是否能整除枚举的数,如果能,则是质数,反之合数。

C Code:

int pd(int n) {
    int i;
    for(i=2; i<=floor(sqrt(n)); i++)
        if(n%i==0) return 0;
    return 1;
}

C++ Code:

bool pd(int n) {
    for(int i=2; i<=floor(sqrt(n)); i++)
        if(n%i==0) return 0;
    return 1;
}

Pascal Code:

Function pd(n:longint):boolean;
var i:longint;
begin
    for i:=2 to trunc(sqrt(n)) do
        if n mod i=0 then exit(false);
    exit(true);
end;

注:C/C++ Code中,调用了floor函数,Pascal Code中,调用了trunc函数,它们都是把浮点数的小数部分去掉(不是四舍五入)。

C/C++和Pascal的sqrt函数是求一个数的算术平方根。

C/C++的floor函数和sqrt函数均在头文件<math.h>中。

2.接下来介绍一种Monte-Carlo算法:

如果n是一个正整数,如果a^(n-1))≡1(mod n),我们说n是基于a的伪素数。如果一个数是伪素数,它几乎肯定是素数。另一方面,如果一个数不是伪素数,它一定不是素数。由于我们可以自由地选取基,所以如果在选取了s个基后发现n都是伪素数,就几乎可以肯定n是素数了。

它最简单的实现方法是一个驯循环,时间复杂度为O(s),s越大,准确率越高。

Pascal Code:

Function MR(n:longint):boolean;
var i,a:longint;
begin
    for i:=1 to s do
    begin
        a:=random(n-2)+2;
        if modular_exp(a,n-1,n)<>1 then  exit(false);
    end;
    exit(true);
end;

注:此处调用了modular_exp函数,即计算a^b mod c的值。

这种思路也可以采用二进制扫描法快速地计算出a^b mod c的值。根据模算术的基本知识,(a*b)mod c=((a mod c)*b)mod c,那么可以把a^b mod c变成一系列较小数的乘积。把b写成二进制(a[t],a[t-1]…,a[1],a[0])。

这样,有:a^b mod c=a^(a[t]*2^t+a[t-1]*2^(t-1)+…+a[1]*2^1+a[0]*2^0)mod c=((a^(a[0]*2^0)mod c)*(a^(a[1]*2^1)mod c)*…*(a^(a[t]*2^t)mod c))mod c。

总时间复杂度为O(log3(b))。

原文地址:https://www.cnblogs.com/ljnoit/p/9536585.html

时间: 2024-11-02 10:59:25

如何判断质数?的相关文章

第3题:判断质数&amp;第4题:简单斐波那契

第3题:判断质数 对于大于1的数,如果除了1和它本身,它不能再被其它正整数整除,那么我们说它是一个质数.晓萌想判断一个数是不是质数,希望找你写个程序,帮助她进行判断. 输入包括一行,为一个整数N(1 < N ≤1000),正是晓萌给出你让你判断的数字.<n≤1000).< style="box-sizing: border-box;"> 输出包括一行,如果晓萌给出的整数N为质数,那么输出YES:如果N不是质数,那么输出NO. 样例输入 3 样例输出 YES 答案

第1题:A+B+C问题&amp;第2题:整除问题&amp;第3题:判断质数

--前三题没理由单独写,放一块吧 ----第1题:A+B+C <strong><span style="font-size:18px;"><span style="color:#ff0000;">#include <stdio.h> </span></span></strong>int main() { int a,b,c; scanf("%d%d%d",&

判断质数的方法

<?php header("Content-type: text/html; charset=utf-8"); /* 一个数,如果只有1和它本身两个因数,这样的数叫做质数(或素数). 例如 2,3,5,7 是质数,而 4,6,8,9 则不是,后者称为合成数或合数. 判断某个自然数是否是素数最常用的方法就是试除法——用比该自然数的平方根小的正整数去除这个自然数, 若该自然数能被整除,则说明其非素数. */ function sushu($a,$b) { for($i=$a;$i&l

C# 判断质数的2种基本方法

质数(prime number)又称素数,有无限个. 质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数. 目前学习了判断数字n是否为质数的2种基本方法: 一.计数法 根据定义,既然质数只能够被1和他本身整除.我们可以统计出1到n范围内的整数,能够整除n的个数.再判断这个个数是否等于2就可以知道n是不是质数. 代码如下: int n = int.Parse(Console.ReadLine()); ;            int sum = 0;            for (i

高质量判断质数

//高质量判断质数 function isPrime(num) { var temp = parseInt(Math.sqrt(num)) for(var i = 2; i <= temp; i++) { if(num % i == 0) { return false } } return true } 给要求证的数进行开平方得到的数字 会大于该数的最小公约数 并且小于该数的最大公约数 原文地址:https://www.cnblogs.com/CoderZX/p/11655626.html

判断质数

对于大于 1 的数,如果除了 1 和它本身,它不能再被其它正整数整除,那么我们说它是一个质数.晓萌想判断一个数是不是质数,希望找你写个程序,帮助她进行判断. 输入格式 输入包括一行,为一个整数 N(1<N≤1000),正是晓萌给出你让你判断的数字. 输出格式 输出包括一行,如果晓萌给出的整数 N 为质数,那么输出YES:如果 N不是质数,那么输出NO. import math N=int(raw_input())ok=1for i in range(2, int(math.sqrt(N)) +

判断质数的几种方法

根据维基百科定义,质数(Prime number),又称素数,指在大于1的自然数中,除了1和此整数自身外,无法被其他自然数整除的数(也可定义为只有1和本身两个因数的数).比1大但不是素数的数称为合数.1和0既非素数也非合数.质数在公钥加密算法(如RSA)中有重要的地位. 下边将会介绍几种较为常见的判断质/素数的方法: 1. 法一:最直接也最笨的方法 法一是按照质数的定义来考虑的,具体程序见下: 1 //*********************************** method 1 **

回顾 - 判断质数精简算法

// 程序循环输出1-100 的质数 #include <stdio.h> int Is_Prime(int n){//判断是否是质数 if ( n==1 || n==0 ) return 0 ;//0,1不是质数 int i ; for ( i=2; i*i <= n ; i ++ ) if (n % i == 0) return ; return 1 ; } int main (){ int i ; for ( i = 0 ; i < 101 ; i ++ ){ if (Is_

通过python判断质数

#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' 质数,只能被1和自己整除的自然数 在数学上,如果一个数不能被从2到该数字开根数之间的任意自然数整除,那么这个数就是质数 ''' #代码判断任意一个自然数是不是质数 from math import floor,sqrt def is_primes(number): if number > 1: if number in (2,3): return True for x in range(2,floo