Алгоритм простих множників: C, Python Приклад

⚡ Розумний підсумок

Алгоритм простих множників розкладає будь-яке додатне ціле число на добуток простих чисел за допомогою пробного ділення до квадратного кореня або варіанта решета Ератосфена, який зберігає кожен найменший простий множник.

  • 🧮 Визначення: Прості дільники цілого числа — це прості числа, добуток яких дорівнює цьому числу; 10 розкладається на 2 та 5.
  • 🔁 Судовий відділ: Ітерація від 2 до sqrt(n) та ділення щоразу, коли модуль дорівнює нулю, виконується за час O(sqrt(n)).
  • 🧰 Метод сита: Зберігання найменшого простого дільника для кожного значення з точністю до певної межі скорочує факторизацію приблизно до O(log n) на запит.
  • 🐍 Python Code: Ітераційні та рекурсивні Python реалізації виводять кожен простий дільник введеного числа.
  • 💻 C Code: Зіставлення ітеративних та рекурсивних програм на C демонструє однакову логіку, використовуючи stdio та попередньо обчислений масив.
  • 🔐 Застосування: Розкладання на прості множники забезпечує перевірку подільності, спрощення дробів, спільні знаменники та криптографічні ключі на основі чисел.

Алгоритм простих множників

Що таке розкладання на прості множники?

Простий дільник числа — це дільник, який сам по собі є просте число, ділиться лише на 1 та на самого себе.

приклад: Простими дільниками числа 10 є 2 та 5, оскільки 2 × 5 = 10.

Знаходження простих множників за допомогою ітерації

Ітеруємо від 2 до sqrt(n) та перевіряємо подільність. Якщо n ділиться на поточного кандидата, поділяємо та виводимо.

приклад: кожне просте число більше 40 підходить для n2+n+41, отже, n = 0, 1, 2 дає 41, 43, 47.

Як надрукувати простий множник числа?

  • Ітерує числа від 2 до sqrt(n).
  • Перевірте модуль n для кожного кандидата; нульовий залишок означає, що кандидат є простим дільником.
  • Зберіть усі прості числа, які ділять 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 Прості множники за допомогою рекурсії

Команда 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, відповідає вигляду 6n + 1 або 6n − 1, де n — додатне ціле число.
  • Множина простих дільників числа унікальна.
  • Число 1 не є ні простим, ні складеним числом.
  • Розкладання на прості множники допомагає з подільністю, спрощенням дробів та знаходженням спільних знаменників.
  • Розкладання на прості множники також лежить в основі криптографічних кодів на основі чисел.

Поширені запитання

Розкладання на прості множники розбиває ціле число на добуток простих чисел, наприклад, 12 = 2 × 2 × 3. Прості множники унікальні для кожного цілого числа, більше одиниці.

Якщо n має множник, більший за sqrt(n), його пара менша і вже буде знайдена. Все, що перевищує sqrt(n), повторює роботу.

Пробне ділення виконується за O(sqrt(n)). Решето попередньо обчислює найменші прості множники за O(N log log N), а потім відповідає на кожне розкладання на множники приблизно за O(log n).

Використовуйте сито під час факторизації багатьох чисел у межах відомої верхньої межі. Одне попереднє обчислення дозволяє кожному наступному запиту виконуватися приблизно за O(log n).

Ні. Число 1 не є ні простим, ні складеним, тому воно ніколи не з'являється у списку простих множників. Розкладання на прості множники використовує прості числа, більші або рівні 2.

Розкладання простих чисел на множники є рушійною силою тестів на подільність, спрощення дробів, ННК та НСД, а також криптографії з відкритим ключем, такої як RSA, де розкладання великого добутку двох простих чисел на множники є складним.

Системи штучного інтелекту застосовують розкладання на прості множники до теоретико-числових ознак, аналізу криптографічних ключів та безпечного федеративного навчання. Дослідження постквантового машинного навчання також вивчають стійкість до факторизації.

Так. GitHub Copilot та подібні помічники зі штучним інтелектом автоматизують шаблони для процедур пробного ділення та просіювання, хоча розробники все ще перевіряють складність та граничні випадки, такі як n = 1.

Підсумуйте цей пост за допомогою: