Простые числа. Решето Эратосфена: различия между версиями

Материал из Олимпиадное программирование в УлГТУ
Перейти к навигации Перейти к поиску
Нет описания правки
Строка 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(NloglogN)
===Получение списка всех делителей числа, O(sqrt(N))===
  const int N = 1000010;
  vector<int> getDivisors(int n) {
static bool p[N];
    vector<int> divisors;
   
for (int i = 2; i < N; i++)
    for (int i = 1; i * i <= n; i++) {
    if (!p[i] && 1LL * i * i < N)
        if (n % i == 0) {
        for (int j = i * i; j < N; j += i)
            divisors.push_back(i);
            p[j] = 1;
            if (i * i != n)
                divisors.push_back(n / i);
        }
    }
   
    sort(divisors.begin(), divisors.end());
    return divisors;
}


O(N)
===Факторизация числа (получение списка простых делителей), O(sqrt(N))===
const int N = 1000010;
  vector<int> factorize(int n) {
  vector<int> primes;
    vector<int> factorization;
static int minDivisor[N];
   
    for (int i = 2; i * i <= n; i++) {
for (int i = 2; i < N; i++) {
        while (n % i == 0) {
    if (!minDivisor[i]) {
            factorization.push_back(i);
        minDivisor[i] = i;
            n /= i;
         primes.push_back(i);
         }
     }
     }
     for (int j = 0; j < primes.size() && primes[j] <= minDivisor[i] && 1LL * i * primes[j] < N; j++)
     if (n != 1)
        minDivisor[i * primes[j]] = primes[j];
        factorization.push_back(n);
   
    return factorization;
  }
  }


== Ссылки на задачи ==
 
* [http://acmp.ru/?main=task&id_task=200 ACMP #200 &mdash; Марсианские факториалы]
===Решето Эратосфена, 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 &mdash; Разложение числа на простые множители (факторизация). Делители числа]
:* [http://e-maxx.ru/algo/prime_sieve_linear E-Maxx — Решето Эратосфена с линейным временем работы]
* [http://brestprog.by/topics/primesieve Brestprog &mdash; Решето Эратосфена]
:* [http://brestprog.by/topics/factorization Brestprog &mdash; Разложение числа на простые множители (факторизация). Делители числа]
* [http://algorithmica.org/tg/number-theory algorithmica.org — Теория чисел]
:* [http://brestprog.by/topics/primesieve Brestprog &mdash; Решето Эратосфена]
* [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 &mdash; Курс &laquo;Арифметика и числовые алгоритмы&raquo; &mdash; часть 1]
:* [http://algorithmica.org/ru/eratosthenes algorithmica.org — Решето Эратосфена]
* [http://github.com/indy256/codelibrary/blob/master/java/src/PrimesAndDivisors.java CodeLibrary &mdash; Prime numbers, sieve of Eratosthenes, Euler's totient function]
:* [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 &mdash; Курс &laquo;Арифметика и числовые алгоритмы&raquo; &mdash; часть 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;
}

Ссылки

Теория:

Код:

Задачи: