【问题标题】:prime factors for large numbers大数的质因数
【发布时间】:2019-04-26 01:22:52
【问题描述】:

我写这个是为了确定任何给定数字的最大素数。它适用于少于 9 位的数字,但当位数超过 9 时,它的行为方式不确定。如何优化它?

这个函数判断一个数是否是素数

def is_prime(x):
    u = 1
    i = 2
    while i < x:
        if x%i == 0:
            u = 0
            break
        else:
            i = i+1
    return u

这个函数判断一个数是否是另一个数的质因数

def detprime(x,y):
    if x%y == 0:
        if (is_prime(y)):
            return 1
        else:
            return 0
    else:
        return 0

这部分检查给定数的所有质因数,将它们存储在一个列表中,并返回最大值

def functionFinal(x):
    import math
    factors = []
    y = x//2
    for i in range(1,y):
        if detprime(x,i) == 1:
            factors.append(i)
    y = len(factors)
    print(factors[y-1])

import time
start_time = time.process_time()
print("Enter a number")
num = int(input())
functionFinal(num)

打印(time.process_time()-start_time)

【问题讨论】:

  • 只检查到x 的平方根。
  • 你可以用this answer中解释的功能来固定你的素数检查器

标签: python prime-factoring


【解决方案1】:

您可以通过更有效的检查素数的函数来改进您的代码。除此之外,您只需要存储列表的最后一个元素factors。此外,您可以通过 JIT 编译函数和使用并行化来提高速度。在下面的代码中,我使用numba

import math
import numba as nb

@nb.njit(cache=True)
def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return 0
    for i in range(3, int(math.sqrt(n)) + 1, 2):
        if n % i == 0:
            return 0
    return 1

@nb.njit(cache=True)
def detprime(x, y):
    if x % y == 0:
        if (is_prime(y)):
            return 1
        else:
            return 0
    else:
        return 0

@nb.njit(parallel=True)
def functionFinal(x):
    factors = [1]
    y = x // 2
    for i in nb.prange(1, y): # check in parallel
        if detprime(x, i) == 1:
            factors[-1] = i

    return factors[-1]

那么,那

functionFinal(234675684)

有性能对比,

您的代码:21.490s

Numba 版本(无并行):0.919s

Numba 版本(并行):0.580s

HTH。

【讨论】:

  • 哇!多么好的进步。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2020-09-04
相关资源
最近更新 更多