Python:检查特定数字是否为质数

Python: To check if a particular number is a prime number

我是 Python 的初学者。 请帮助获得正确和准确的代码;我试图直接将以下数学语句直接翻译成 Python 术语:

let Q = [2,...,n-1] if there exist p,q ∈ Q | pq = n, then n is not a prime number

where n is any integer I want to check if it's prime or not

这是我的 python 代码,我尝试使用 random.randint() 浏览列表,我得到了错误的结果(它检查一个数字,但 returns 所有正整数都是质数数)

import random

def primechecker(anumber):
    
    if anumber <= 1:
        print('1 is not a prime number, \n*2Input a positive integer greater than 1')
    
    p = random.randint(2,anumber)
    q = random.randint(2,anumber)
    if p*q==anumber:
        print('%d is not a prime number'%anumber)
    
    else:
        print('%d is a prime number ! :-)'%anumber)
        
primechecker(12)

你的问题是你只检查一组 pq,所以如果你很幸运你只会得到 "not a prime number" 输出和 p*q 刚好等于 anumber 第一次去。

大多数非常简单的素数检查器的工作方式是在 0 和测试数的平方根之间顺序,对于 p 和 q,排除所有可能的因素。虽然有 loads of other ways 检查主要性。


不过,因为电脑速度很快,所以你可以保留随机选择,试几千次就可以了,对于小的数字,你很可能是正确的!妥善度过还是最好的办法。

(免责声明 - 这不是真正的解决方案,只是以更正确的方式使用 random 的示例)

我已经在您的代码中添加了一个 for 循环,如果它找到一个匹配项,它将打印然后从函数中提前执行 return,或者如果它仍然没有找到匹配项10000 次随机尝试,说这可能是素数。

import random

def primechecker(anumber):
    
    if anumber <= 1:
        print('1 is not a prime number, \n*2Input a positive integer greater than 1')
    
    for _ in range(10000):
      p = random.randint(2,anumber)
      q = random.randint(2,anumber)
      if p*q==anumber:
          print('%d is not a prime number'%anumber)
          return

    print('%d is maybe a prime number ! :-)'%anumber)
        
        
        
primechecker(70)import random

def primechecker(anumber):
    
    if anumber <= 1:
        print('1 is not a prime number, \n*2Input a positive integer greater than 1')
    
    for _ in range(10000):
      p = random.randint(2,anumber)
      q = random.randint(2,anumber)
      if p*q==anumber:
          print('%d is not a prime number'%anumber)
          return

    print('%d is probably a prime number ! :-)'%anumber)
        
        
        
primechecker(70)
          

import random

def primechecker(anumber):
    
    if anumber <= 1:
        print('1 is not a prime number, \n*2Input a positive integer greater than 1')
    
    for _ in range(10000):
      p = random.randint(2,anumber)
      q = random.randint(2,anumber)
      if p*q==anumber:
          print('%d is not a prime number'%anumber)
          return

    print('%d is probably a prime number ! :-)'%anumber)
        
        
        
primechecker(7)        
primechecker(99)        
primechecker(90)
                

在这里试一试 -> https://repl.it/@LukeStorry/63038315

如您所见,对于较大的数字不是很准确,方法是不使用随机,而是按顺序进行,但如果您正在学习,这是一个很好的尝试 python.

我希望你知道它通常是如何完成的,即遍历 2n-1 并检查数字是否可以被范围内的任何数字整除。

现在,为了实现质数的陈述,random 并不是一个真正的解决方案,你可能需要等待很长时间才能得到匹配,如果有的话,当有匹配不上,除了将所有先前的猜测存储在某个地方外,几乎没有其他方法可以判断。

所以你可以做一件事,尝试使用 itertools.combinations:

获取范围内 pq 的所有组合
from itertools import combinations

def primechecker(number):
    if number <= 1: return "Please enter number > 1"

    for p, q in combinations(iterable=range(2,number), r=2):
        if p*q == number:
            return f"Not prime. {p} * {q} = {number}"

    else:
        return "Prime"

现在检查:

>>> primechecker(1)
'Please enter number > 1'

>>> primechecker(15)
'Not prime. 3 * 5 = 15'

>>> primechecker(17)
'Prime'