소인수 알고리즘: C, Python 예시

⚡ 스마트 요약

소수 분해 알고리즘은 제곱근까지의 시행 나눗셈 또는 가장 작은 소인수를 저장하는 에라토스테네스의 체 변형을 사용하여 임의의 양의 정수를 소수의 곱으로 분해합니다.

  • 🧮 정의: 정수의 소인수는 곱하면 그 정수가 되는 소수입니다. 예를 들어 10은 2와 5로 나눌 수 있습니다.
  • 🔁 재판부: 2부터 sqrt(n)까지 반복하고 나머지가 0일 때마다 나누는 것은 O(sqrt(n)) 시간 안에 실행됩니다.
  • 🧰 체질법: 특정 범위 내의 모든 값에 대해 가장 작은 소인수를 저장하면 소인수분해 시간이 쿼리당 약 O(log n)으로 단축됩니다.
  • 🐍 Python Code: 반복적이고 재귀적인 Python 구현 방식은 입력된 숫자의 각 소인수를 출력합니다.
  • 💻 C Code: 표준 입출력(stdio)과 미리 계산된 배열을 사용하여 반복문과 재귀문을 사용하는 C 프로그램의 논리가 동일함을 비교 분석합니다.
  • 🔐 용도 : 소인수분해는 나누어떨어짐 검사, 분수 간소화, 공통 분모, 숫자 기반 암호화 키 등에 활용됩니다.

소인수 알고리즘

소인수분해란 무엇입니까?

어떤 수의 소인수는 그 자체가 1인 수입니다. 소수1과 자기 자신으로만 나누어떨어집니다.

예: 10의 소인수는 2와 5입니다. 왜냐하면 2 × 5 = 10이기 때문입니다.

반복을 사용하여 소인수 찾기

2부터 sqrt(n)까지 반복하면서 나누어 떨어지는지 확인합니다. n이 현재 후보로 나누어 떨어지는 동안에는 나누고 결과를 출력합니다.

예: 40보다 큰 모든 소수는 n에 적합합니다.2+n+41이므로 n = 0, 1, 2일 때 결과는 41, 43, 47입니다.

숫자의 소인수를 인쇄하는 방법은 무엇입니까?

  • 2부터 sqrt(n)까지 숫자를 반복합니다.
  • 각 후보에 대해 n의 나머지를 확인하십시오. 나머지가 0이면 해당 후보는 소인수입니다.
  • n을 나누는 모든 소수를 모으세요.
  • 이 루틴은 O(sqrt(n)) 시간 복잡도로 실행됩니다.

연산:

Set a counter i to 2
While i <= sqrt(n):
    While n % i == 0:
        n = n / i
        print i
    i = i + 1
if n > 1:
    print n

체 알고리즘

체 방법은 최대값까지 모든 수의 가장 작은 소인수를 저장하여 사전 계산 후 소인수 분해 비용을 크게 줄입니다.

  • 최대값까지 모든 정수의 가장 작은 소인수를 기록하세요.
  • 가장 작은 소수를 골라서 인수 집합에 추가하세요.
  • 그 수를 해당 소수로 나누고, 결과가 1이 될 때까지 이 과정을 반복합니다.
  • 각 쿼리는 대략 O(log n)의 시간 복잡도로 실행됩니다.

예: 2와 3 이외의 소수는 6n-1 또는 6n+1의 형태를 갖습니다. 예를 들어 5 = 6(1)-1이고 19 = 6(3)+1입니다.

연산: 정의하다 정렬 각 숫자의 가장 작은 소인수를 저장하며, 인덱스를 각 요소의 초기값으로 사용합니다.

Set array[1] to 1
Set i to 2
While i*i <= max_number:
    If array[i] == i:
        Set j to i*i
        While j <= max_number:
            If array[j] == j:
                array[j] = i
            j = j + i
    i = i + 1
while the_number != 1:
    print array[the_number]
    the_number = the_number / array[the_number]

관련 기사

Python 반복을 사용한 소인수

다음 Python 이 코드는 반복적인 나눗셈 방법을 사용하여 소인수를 찾습니다.

import math
def PrimeFactors(n):
    for i in range(2, int(math.sqrt(n)) + 1, 1):
        while n % i == 0:  # find all the occurrences of a prime factor
            print((int)(i))
            n = n // i
    if n != 1:  # if the number was originally a prime
        print((int)(n))
n = (int)(input("Enter the number you want: "))
PrimeFactors(n)

출력:

Enter the number you want: 4
2
2

Python 재귀를 사용한 소인수

The Python 아래 코드는 체법을 사용하여 주어진 숫자의 소인수를 찾습니다.

import math
High = (int)(1e5 + 7)
array = [0 for i in range(High)]

# generate smallest prime factors
def Sieve():
    for i in range(1, High):
        array[i] = i
    for i in range(2, math.ceil(math.sqrt(High))):
        if array[i] == i:
            for j in range(i * i, High, i):
                if array[j] == j:
                    array[j] = i

def PrimeFactors(n):  # divide until we reach 1
    if n == 1:
        return
    print((int)(array[n]))
    PrimeFactors((int)(n / array[n]))

Sieve()
n = (int)(input("Enter the number you want: "))
PrimeFactors(n)

출력:

Enter the number you want: 4
2
2

반복을 사용한 C 소인수 프로그램

동일한 반복 솔루션이 작성되었습니다. C숫자를 입력한 다음 2부터 sqrt(n)까지의 각 후보에 대해 나누어 떨어지는지 확인하고 소인수가 나타나는 모든 위치를 출력합니다.

#include <stdio.h>
int main()
{
    int n;
    printf("Enter the number you want: ");
    scanf("%d", &n);
    for (int i = 2; i * i <= n; i++)
    {
        while (n % i == 0)  // find all the occurrences of a prime factor
        {
            printf("%d\n", i);
            n /= i;
        }
    }
    if (n != 1)  // if the number was originally a prime
    {
        printf("%d", n);
    }
    return 0;
}

출력:

Enter the number you want: 2
2

재귀를 사용한 C 소인수 프로그램

재귀를 사용한 C 소인수 프로그램

재귀적인 C 버전은 다음을 반영합니다. Python 첫 번째 단계는 가장 작은 소인수들의 배열을 만드는 것입니다. 그런 다음 n이 1이 될 때까지 해당 소인수로 나누는 과정을 재귀적으로 수행합니다.

#include <stdio.h>
int Max = 100007;
int array[100007];

void Sieve()  // smallest prime factors up to Max
{
    for (int i = 1; i < Max; i++)
        array[i] = i;
    for (int i = 2; i * i <= Max; i++)
    {
        if (array[i] == i)
        {
            for (int j = i * i; j < Max; j += i)
            {
                if (array[j] == j)
                    array[j] = i;
            }
        }
    }
}

void PrimeFactors(int n)
{
    if (n == 1)  // divide until we reach 1
        return;
    printf("%d\n", array[n]);
    PrimeFactors(n / array[n]);
}

int main()
{
    Sieve();
    int n;
    printf("Enter the number you want: ");
    scanf("%d", &n);
    PrimeFactors(n);
    return 0;
}

출력:

Enter the number you want: 2
2

소수에 대한 몇 가지 흥미로운 사실

  • 2를 제외한 모든 짝수는 두 소수의 합으로 나타낼 수 있습니다 (4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3).
  • 2와 3을 제외하고는 연속된 소수가 없습니다. 왜냐하면 2가 유일한 짝수 소수이기 때문입니다.
  • 2와 3을 제외한 모든 소수는 n이 양의 정수일 때 6n + 1 또는 6n − 1의 형태를 갖습니다.
  • 어떤 수의 소인수 집합은 유일하다.
  • 숫자 1은 소수도 아니고 합성수도 아닙니다.
  • 소인수분해는 나누어떨어짐 여부 확인, 분수 간소화, 공통분모 찾기에 도움이 됩니다.
  • 소인수분해는 숫자 기반 암호화 코드의 기본 원리이기도 합니다.

자주 묻는 질문

소인수분해는 정수를 소수의 곱으로 나누는 방법입니다. 예를 들어 12는 2 × 2 × 3입니다. 1보다 큰 모든 정수에 대해 소인수는 서로 다릅니다.

n의 약수가 sqrt(n)보다 크면, 그 쌍은 더 작으므로 이미 찾은 것입니다. sqrt(n)을 초과하는 경우에는 작업이 반복됩니다.

시행 나눗셈은 O(sqrt(n))의 시간 복잡도로 실행됩니다. 체는 가장 작은 소인수를 O(N log log N)의 시간 복잡도로 미리 계산한 다음, 각 인수분해에 대해 약 O(log n)의 시간 복잡도로 결과를 도출합니다.

상한값이 알려진 여러 수를 인수분해할 때 체를 사용하십시오. 사전 계산 한 번으로 이후의 각 쿼리는 약 O(log n)의 시간 복잡도로 실행될 수 있습니다.

아니요. 숫자 1은 소수도 아니고 합성수도 아니므로 소인수 분해 목록에 나타나지 않습니다. 소인수 분해는 2 이상의 소수를 사용합니다.

소인수분해는 나눗셈 판정, 분수 간소화, 최소공배수와 최대공약수, 그리고 두 소수의 큰 곱을 소인수분해하기 어려운 RSA와 같은 공개키 암호화에 사용됩니다.

AI 시스템은 소인수분해를 수론적 특징, 암호 키 분석 및 안전한 연합 학습에 적용합니다. 양자 컴퓨팅 이후의 머신러닝 연구에서는 소인수분해 저항성도 연구합니다.

네. GitHub Copilot과 같은 AI 도우미는 시행 나눗셈 및 체질 루틴에 필요한 반복적인 작업을 자동화하지만, 개발자는 여전히 복잡성과 n=1과 같은 예외 상황을 검증해야 합니다.

이 게시물을 요약하면 다음과 같습니다.