소인수 분해에 관한 Python 클래식 100가지 질문

소인수(Prime Factor)는 양의 정수가 여러 소수의 곱으로 분해될 수 있다는 것을 의미하며, 각 소수는 양의 정수의 인수입니다. 예를 들어, 숫자 12는 2 × 2 × 3으로 분해될 수 있습니다. 여기서 2와 3은 모두 소수이므로 숫자 12의 소인수입니다.

알고리즘 1: 잔인한 열거 방법

아이디어: 2에서 n-1까지 n이 나누어질 수 있는지 판단합니다. 나누어질 수 있으면 소인수가 있다는 뜻입니다. 저장하고 n을 소인수로 나눈 다음 n에 대해 동일한 연산을 계속 수행합니다. ... n이 1이 될 때까지 위 단계를 반복하고, 마지막으로 모든 소인수를 구합니다.

암호:

def prime_factor(num):
    factors = []
    i = 2
    while i <= num:
        if num % i == 0:
            factors.append(i)
            num = num // i
            i = 2
        else:
            i += 1
    return factors

장점과 단점 분석:

무차별 열거 방법의 시간 복잡도는 O(n)입니다. n이 작을 때 이 알고리즘은 특정한 이점을 갖습니다. 그러나 n이 커지면 시간 복잡도가 높아지고 알고리즘 효율성이 낮아집니다.

알고리즘 2: 소인수 분해

아이디어: 양의 정수 n에 대해 소인수 p가 있으면 n은 n=p*q로 표현될 수 있습니다. 여기서 q는 p를 제외한 다른 소인수들의 곱입니다. 그러므로 먼저 2가 n의 소인수인지 판단할 수 있고, 그렇다면 저장하고 n을 2로 나눈다. n의 소인수. n은 각 소인수로 나누면 작아지므로, n이 소수가 아닌 경우, 소인수를 분해하여 구한 모든 소인수는 n의 제곱근보다 작거나 같아야 합니다.

암호:

def prime_factor(num):
    factors = []
    i = 2
    while i * i <= num:
        if num % i == 0:
            factors.append(i)
            num = num // i
        else:
            i += 1
    if num > 1:
        factors.append(num)
    return factors

장점과 단점 분석:

소인수 분해의 시간 복잡도는 O(sqrt(n))입니다. 무차별 열거 방법에 비해 시간 복잡도가 낮으므로 더 큰 양의 정수를 처리할 때 알고리즘이 더 효율적입니다.

알고리즘 3: 시험 분할

아이디어: 양의 정수 n에 대해 소인수 p가 있으면 n은 n=p*q로 표현될 수 있습니다. 여기서 q는 p를 제외한 다른 소인수들의 곱입니다. 2부터 n-1까지 순차적으로 시행나눗셈을 할 수 있는데, 어떤 수 i가 n으로 나누어질 수 있다는 것을 발견하면 i가 n의 소인수임을 의미하므로 저장하고 n을 i로 나눈 다음 계속한다. 동일한 프로세스.작업. n에는 n의 제곱근보다 큰 소인수가 있을 수 있으므로 n의 제곱근으로 나누기만 하면 됩니다.

암호:

import math
def prime_factor(num):
    factors = []
    i = 2
    while i <= math.sqrt(num):
        if num % i == 0:
            factors.append(i)
            num = num // i
        else:
            i += 1
    if num > 1:
        factors.append(num)
    return factors

장점과 단점 분석:

시행 분할의 시간 복잡도는 O(sqrt(n))이며, 이는 소인수 인수분해의 시간 복잡도와 동일합니다. 그러나 실제 연산에서는 시분할의 효율성이 소인수 분해 방법에 비해 좋지 않다. 왜냐하면 시분할에는 많은 나눗셈 연산이 필요하고, 소인수 분해 방법은 소수의 나눗셈 연산만 필요하기 때문이다. 시험분할의 효율성이 낮다.

위의 세 가지 알고리즘을 바탕으로 소인수분해 방법이 가장 효율적인 알고리즘인데, 무차별 열거 방법은 간단하지만 시간 복잡도가 높아 작은 데이터를 처리하는 데에만 적합합니다.

Supongo que te gusta

Origin blog.csdn.net/yechuanhui/article/details/132870883
Recomendado
Clasificación