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

Що таке розкладання на прості множники?
Простий дільник числа — це дільник, який сам по собі є просте число, ділиться лише на 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]
Статті по темі
- Граф Структура даних і Algorithms
- Проблема продавця подорожі
- Алгоритм методу бісекції
- Алгоритм сортування ковша
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 відображає 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 не є ні простим, ні складеним числом.
- Розкладання на прості множники допомагає з подільністю, спрощенням дробів та знаходженням спільних знаменників.
- Розкладання на прості множники також лежить в основі криптографічних кодів на основі чисел.

