Простые числа. Решето Эратосфена: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) Нет описания правки |
Ctrlalt (обсуждение | вклад) Нет описания правки |
||
(не показано 6 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
===Проверка числа на простоту, O(sqrt(N))=== | ===Проверка числа на простоту, O(sqrt(N))=== | ||
{| width="100%" | |||
| width=50% | | |||
bool isPrime(int n) { | bool isPrime(int n) { | ||
if (n < 2) | if (n < 2) | ||
return 0; | return 0; | ||
for (long long | for (long long d = 2; d * d <= n; d++) | ||
if (n % | if (n % d == 0) | ||
return 0; | return 0; | ||
return 1; | return 1; | ||
} | } | ||
| width="10px" | | |||
| width=50% | | |||
bool isPrime(int n) { | |||
if (n < 2) | |||
return 0; | |||
static vector<int> primes = getPrimes(1e5); | |||
for (int i = 0; 1LL * primes[i] * primes[i] <= n; i++) | |||
if (n % primes[i] == 0) | |||
return 0; | |||
return 1; | |||
} | |||
|} | |||
===Получение списка | ===Получение списка делителей числа, O(sqrt(N))=== | ||
{| width="100%" | |||
| width=50% | | |||
vector<int> getDivisors(int n) { | vector<int> getDivisors(int n) { | ||
vector<int> divisors; | vector<int> divisors; | ||
for (long long | for (long long d = 1; d * d <= n; d++) { | ||
if (n % | if (n % d == 0) { | ||
divisors.push_back( | divisors.push_back(d); | ||
if ( | if (d * d != n) | ||
divisors.push_back(n / | divisors.push_back(n / d); | ||
} | } | ||
} | } | ||
Строка 26: | Строка 45: | ||
return divisors; | return divisors; | ||
} | } | ||
| width="10px" | | |||
| width=50% | | |||
vector<int> getPrimeDivisors(int n) { | |||
vector<int> primeDivisors; | |||
for (long long d = 2; d * d <= n; d++) { | |||
if (n % d == 0) { | |||
primeDivisors.push_back(d); | |||
while (n % d == 0) | |||
n /= d; | |||
} | |||
} | |||
if (n != 1) | |||
primeDivisors.push_back(n); | |||
return primeDivisors; | |||
} | |||
|} | |||
===Факторизация числа (получение списка простых делителей), O(sqrt(N))=== | ===Факторизация числа (получение списка простых делителей), O(sqrt(N))=== | ||
{| width="100%" | |||
| width=50% | | |||
vector<int> factorize(int n) { | vector<int> factorize(int n) { | ||
vector<int> factorization; | vector<int> factorization; | ||
for (long long | for (long long d = 2; d * d <= n; d++) { | ||
while (n % | while (n % d == 0) { | ||
factorization.push_back( | factorization.push_back(d); | ||
n /= | n /= d; | ||
} | } | ||
} | } | ||
Строка 42: | Строка 82: | ||
return factorization; | return factorization; | ||
} | } | ||
| width="10px" | | |||
| width=50% | | |||
map<int, int> factorize(int n) { | |||
map<int, int> factorization; | |||
for (long long d = 2; d * d <= n; d++) { | |||
while (n % d == 0) { | |||
factorization[d]++; | |||
n /= d; | |||
} | |||
} | |||
if (n != 1) | |||
factorization[n]++; | |||
return factorization; | |||
} | |||
|} | |||
===Решето Эратосфена, O(NloglogN)=== | ===Решето Эратосфена, O(NloglogN)=== | ||
vector<int> getPrimes() { | vector<int> getPrimes(int n) { | ||
vector<int> isPrime(n + 1, 1), primes; | |||
vector<int> isPrime( | |||
for (int i = 2; i < isPrime.size(); i++) { | |||
for (int i = 2; i < | |||
if (isPrime[i]) { | if (isPrime[i]) { | ||
primes.push_back(i); | primes.push_back(i); | ||
for (long long j = 1LL * i * i; j < | for (long long j = 1LL * i * i; j < isPrime.size(); j += i) | ||
isPrime[j] = 0; | isPrime[j] = 0; | ||
} | } | ||
} | } | ||
return primes; | return primes; | ||
} | } | ||
===Решето Эратосфена, O(N)=== | ===Решето Эратосфена, O(N)=== | ||
vector<int> getPrimes() { | vector<int> getPrimes(int n) { | ||
vector<int> minDivisor(n + 1), primes; | |||
vector<int> minDivisor( | |||
for (int i = 2; i < minDivisor.size(); i++) { | |||
for (int i = 2; i < | |||
if (!minDivisor[i]) { | if (!minDivisor[i]) { | ||
minDivisor[i] = i; | minDivisor[i] = i; | ||
primes.push_back(i); | primes.push_back(i); | ||
} | } | ||
for (int j = 0; j < primes.size() && primes[j] <= minDivisor[i] && 1LL * i * primes[j] < | for (int j = 0; j < primes.size() && primes[j] <= minDivisor[i] && 1LL * i * primes[j] < minDivisor.size(); j++) | ||
minDivisor[i * primes[j]] = primes[j]; | minDivisor[i * primes[j]] = primes[j]; | ||
} | } | ||
return primes; | return primes; | ||
} | } |
Текущая версия от 22:37, 14 августа 2024
Проверка числа на простоту, O(sqrt(N))
bool isPrime(int n) { if (n < 2) return 0; for (long long d = 2; d * d <= n; d++) if (n % d == 0) return 0; return 1; } |
bool isPrime(int n) { if (n < 2) return 0; static vector<int> primes = getPrimes(1e5); for (int i = 0; 1LL * primes[i] * primes[i] <= n; i++) if (n % primes[i] == 0) return 0; return 1; } |
Получение списка делителей числа, O(sqrt(N))
vector<int> getDivisors(int n) { vector<int> divisors; for (long long d = 1; d * d <= n; d++) { if (n % d == 0) { divisors.push_back(d); if (d * d != n) divisors.push_back(n / d); } } sort(divisors.begin(), divisors.end()); return divisors; } |
vector<int> getPrimeDivisors(int n) { vector<int> primeDivisors; for (long long d = 2; d * d <= n; d++) { if (n % d == 0) { primeDivisors.push_back(d); while (n % d == 0) n /= d; } } if (n != 1) primeDivisors.push_back(n); return primeDivisors; } |
Факторизация числа (получение списка простых делителей), O(sqrt(N))
vector<int> factorize(int n) { vector<int> factorization; for (long long d = 2; d * d <= n; d++) { while (n % d == 0) { factorization.push_back(d); n /= d; } } if (n != 1) factorization.push_back(n); return factorization; } |
map<int, int> factorize(int n) { map<int, int> factorization; for (long long d = 2; d * d <= n; d++) { while (n % d == 0) { factorization[d]++; n /= d; } } if (n != 1) factorization[n]++; return factorization; } |
Решето Эратосфена, O(NloglogN)
vector<int> getPrimes(int n) { vector<int> isPrime(n + 1, 1), primes; for (int i = 2; i < isPrime.size(); i++) { if (isPrime[i]) { primes.push_back(i); for (long long j = 1LL * i * i; j < isPrime.size(); j += i) isPrime[j] = 0; } } return primes; }
Решето Эратосфена, O(N)
vector<int> getPrimes(int n) { vector<int> minDivisor(n + 1), primes; for (int i = 2; i < minDivisor.size(); 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] < minDivisor.size(); j++) minDivisor[i * primes[j]] = primes[j]; } return primes; }
Ссылки
Теория:
Код:
Задачи: