Python判断整数是否为素数(质数)的低复杂度方法,含源码

在数学定义中,素数(质数)即为除了1和该数自身外,无法被其他整数整除的数。且1不为素数(质数)。

素数基本特点

  1. 1不是素数,2是素数,3是素数
  2. 2以外的数一定是奇数,因为偶数能被2整除
  3. 大于3的素数一定满足6n+16n+5型,其中n是非负整数,但满足6n+16n+5不一定是素数

        对第3点做一些说明。如果一个数满足6n+2 ,则能被2整除,6n+4同理。如果一个数满足6n或者6n+3,则一定能被3整除。所以一个大于3的数若是素数一定满足6n+1或者6n+5

代码思路如下

  1. if语句判断,若m=1,则返回False(表示m不是素数)。若m=2或m=3,则返回True(表示m是素数)
  2. if语句判断,若m%6 != 1且m%6 != 5,则m一定不是素数,返回False
  3. m%6 = 1或者m%6 = 5,则说明m可能为素数,再遍历寻找m的因数(假设因数为i),若找到某个非1m本身i,则m不是素数,返回False。遍历时掌握一定技巧,若存在符合条件的因数,则该因数一定是小于等于根号m的整数,且该因数一定满足6n+1或者6n+5。原因很简单,若i=6ni=6n+2i=6n+3或者i=6n+4,则i本身就可以被2或3整除,所以m一定不符合6n+16n+5

 代码如下

import math


def isPrime(m):
    if m == 1:
        # print(m, '不是素数')
        return False
    if m == 2 or m == 3:
        # print(m, '是素数哦')
        return True
    if m % 6 != 1 and m % 6 != 5:
        # print(m, '不是素数')
        return False
    else:
        n = int(math.sqrt(m))
        for i in range(5, n + 2, 6):
            #遍历寻找m可能的因数i,循环的步长设为 6
            #每次只判断 6 两侧的数是否是m的因数即可
            if m % i == 0 or m % (i + 2) == 0:
                # print(m, '不是素数')
                return False
    # print(m, '是素数')
    return True

猜你喜欢

转载自blog.csdn.net/ZZR2631574030/article/details/126147498
今日推荐