簡體   English   中英

大數的主要因素

[英]prime factors for large numbers

我寫這個來確定任何給定數字的最大素數因子。 它適用於少於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)

您可以通過更有效的函數來檢查素數來改進代碼。 除此之外,您只需要存儲列表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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM