Простые числа. Решето Эратосфена: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) (→Ссылки) |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
| Строка 1: | Строка 1: | ||
===Проверка числа на простоту, O(sqrt(N))=== | |||
bool isPrime(int n) { | |||
if (n < 2) | |||
return 0; | |||
for (int i = 2; i * i <= n; i++) | |||
if (n % i == 0) | |||
return 0; | |||
return 1; | |||
} | |||
O( | ===Получение списка всех делителей числа, O(sqrt(N))=== | ||
vector<int> getDivisors(int n) { | |||
vector<int> divisors; | |||
for (int i = 1; i * i <= n; i++) { | |||
if (n % i == 0) { | |||
divisors.push_back(i); | |||
if (i * i != n) | |||
divisors.push_back(n / i); | |||
} | |||
} | |||
sort(divisors.begin(), divisors.end()); | |||
return divisors; | |||
} | |||
O(N) | ===Факторизация числа (получение списка простых делителей), O(sqrt(N))=== | ||
vector<int> factorize(int n) { | |||
vector<int> | vector<int> factorization; | ||
for (int i = 2; i * i <= n; i++) { | |||
while (n % i == 0) { | |||
factorization.push_back(i); | |||
n /= i; | |||
} | |||
} | } | ||
if (n != 1) | |||
factorization.push_back(n); | |||
return factorization; | |||
} | } | ||
== | |||
* [ | ===Решето Эратосфена, O(NloglogN)=== | ||
vector<int> getPrimes() { | |||
const int N = 1e6; | |||
vector<int> isPrime(N, 1), primes; | |||
for (int i = 2; i < N; i++) { | |||
if (isPrime[i]) { | |||
primes.push_back(i); | |||
for (long long j = 1LL * i * i; j < N; j += i) | |||
isPrime[j] = 0; | |||
} | |||
} | |||
return primes; | |||
} | |||
===Решето Эратосфена, O(N)=== | |||
vector<int> getPrimes() { | |||
const int N = 1e6; | |||
vector<int> minDivisor(N), primes; | |||
for (int i = 2; i < N; i++) { | |||
if (!minDivisor[i]) { | |||
minDivisor[i] = i; | |||
primes.push_back(i); | |||
} | |||
for (int j = 0; j < primes.size() && primes[j] <= minDivisor[i] && 1LL * i * primes[j] < N; j++) | |||
minDivisor[i * primes[j]] = primes[j]; | |||
} | |||
return primes; | |||
} | |||
== Ссылки == | == Ссылки == | ||
* [http://e-maxx.ru/algo/eratosthenes_sieve E-Maxx — Решето Эратосфена] | Теория: | ||
* [http://e-maxx.ru/algo/prime_sieve_linear E-Maxx — Решето Эратосфена с линейным временем работы] | :* [http://e-maxx.ru/algo/eratosthenes_sieve E-Maxx — Решето Эратосфена] | ||
* [http://brestprog.by/topics/factorization Brestprog — Разложение числа на простые множители (факторизация). Делители числа] | :* [http://e-maxx.ru/algo/prime_sieve_linear E-Maxx — Решето Эратосфена с линейным временем работы] | ||
* [http://brestprog.by/topics/primesieve Brestprog — Решето Эратосфена] | :* [http://brestprog.by/topics/factorization Brestprog — Разложение числа на простые множители (факторизация). Делители числа] | ||
* [http://algorithmica.org/tg/number-theory algorithmica.org — Теория чисел] | :* [http://brestprog.by/topics/primesieve Brestprog — Решето Эратосфена] | ||
* [http://algorithmica.org/ru/eratosthenes algorithmica.org — Решето Эратосфена] | :* [http://algorithmica.org/tg/number-theory algorithmica.org — Теория чисел] | ||
* [http://informatics.mccme.ru/course/view.php?id=17 informatics.mccme.ru — Курс «Арифметика и числовые алгоритмы» — часть 1] | :* [http://algorithmica.org/ru/eratosthenes algorithmica.org — Решето Эратосфена] | ||
:* [https://usaco.guide/gold/divis?lang=cpp#prime-factorization USACO Guide — Prime Factorization] | |||
Код: | |||
:* [https://github.com/indy256/codelibrary/blob/master/cpp/numbertheory/primes_and_divisors.cpp indy256/codelibrary/cpp/numbertheory/primes_and_divisors.cpp] | |||
:* [https://github.com/indy256/codelibrary/blob/master/cpp/numbertheory/factorization.cpp indy256/codelibrary/cpp/numbertheory/factorization.cpp] | |||
Задачи: | |||
:* [http://acmp.ru/?main=task&id_task=200 ACMP #200] | |||
:* [[:Категория: Задачи: Простые числа|Задачи: Простые числа]] | |||
:* [http://informatics.mccme.ru/course/view.php?id=17 informatics.mccme.ru — Курс «Арифметика и числовые алгоритмы» — часть 1] | |||
[[Category:Арифметические алгоритмы]] | [[Category:Арифметические алгоритмы]] | ||
Версия от 06:38, 25 марта 2021
Проверка числа на простоту, O(sqrt(N))
bool isPrime(int n) {
if (n < 2)
return 0;
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
return 0;
return 1;
}
Получение списка всех делителей числа, O(sqrt(N))
vector<int> getDivisors(int n) {
vector<int> divisors;
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
divisors.push_back(i);
if (i * i != n)
divisors.push_back(n / i);
}
}
sort(divisors.begin(), divisors.end());
return divisors;
}
Факторизация числа (получение списка простых делителей), O(sqrt(N))
vector<int> factorize(int n) {
vector<int> factorization;
for (int i = 2; i * i <= n; i++) {
while (n % i == 0) {
factorization.push_back(i);
n /= i;
}
}
if (n != 1)
factorization.push_back(n);
return factorization;
}
Решето Эратосфена, O(NloglogN)
vector<int> getPrimes() {
const int N = 1e6;
vector<int> isPrime(N, 1), primes;
for (int i = 2; i < N; i++) {
if (isPrime[i]) {
primes.push_back(i);
for (long long j = 1LL * i * i; j < N; j += i)
isPrime[j] = 0;
}
}
return primes;
}
Решето Эратосфена, O(N)
vector<int> getPrimes() {
const int N = 1e6;
vector<int> minDivisor(N), primes;
for (int i = 2; i < N; i++) {
if (!minDivisor[i]) {
minDivisor[i] = i;
primes.push_back(i);
}
for (int j = 0; j < primes.size() && primes[j] <= minDivisor[i] && 1LL * i * primes[j] < N; j++)
minDivisor[i * primes[j]] = primes[j];
}
return primes;
}
Ссылки
Теория:
Код:
Задачи: