Wiki Thuật toán Toán học

Toán học

huunguyen huunguyen Updated Tháng sáu 1, 2026

Số nguyên tố

bool is_prime(long long n) {
    if (n<2) return false;
    for (long long i=2; i*i<=n; i++) if (n%i==0) return false;
    return true;
}

// Sàng Eratosthenes: O(N log log N)
vector<bool> sieve(int n) {
    vector<bool> p(n+1,true); p[0]=p[1]=false;
    for (int i=2; i*i<=n; i++) if (p[i]) for (int j=i*i; j<=n; j+=i) p[j]=false;
    return p;
}
def is_prime(n):
    if n < 2: return False
    for i in range(2, int(n**0.5)+1):
        if n % i == 0: return False
    return True

GCD và LCM

#include <numeric>
int g = gcd(a, b);
int l = lcm(a, b);
from math import gcd
g = gcd(a, b)
l = a * b // gcd(a, b)

Modular Arithmetic

const long long MOD = 1e9+7;
(a+b)%MOD
(a-b+MOD)%MOD
a*b%MOD

// Lũy thừa nhanh O(log n)
long long power(long long a, long long n, long long mod) {
    long long res=1; a%=mod;
    while (n>0) { if (n&1) res=res*a%mod; a=a*a%mod; n>>=1; }
    return res;
}

// Nghịch đảo modulo (mod nguyên tố)
long long inv(long long a) { return power(a, MOD-2, MOD); }
pow(a, n, mod)  # lũy thừa nhanh built-in

Tổ hợp C(n,k)modp

const int MAXN=1e6+5;
long long fact[MAXN], inv_fact[MAXN];
void precompute() {
    fact[0]=1;
    for (int i=1; i<MAXN; i++) fact[i]=fact[i-1]*i%MOD;
    inv_fact[MAXN-1]=power(fact[MAXN-1],MOD-2,MOD);
    for (int i=MAXN-2; i>=0; i--) inv_fact[i]=inv_fact[i+1]*(i+1)%MOD;
}
long long C(int n,int k) {
    if (k<0||k>n) return 0;
    return fact[n]*inv_fact[k]%MOD*inv_fact[n-k]%MOD;
}
from math import comb
print(comb(10, 3))  # C(10,3) = 120

Phân tích thừa số nguyên tố

map<int,int> factorize(int n) {
    map<int,int> f;
    for (int i=2; i*i<=n; i++) while (n%i==0) { f[i]++; n/=i; }
    if (n>1) f[n]++;
    return f;
}

Thuật toán Euclid mở rộng

Tìm x,y sao cho ax+by=gcd(a,b):

long long ext_gcd(long long a, long long b, long long& x, long long& y) {
    if (b == 0) { x = 1; y = 0; return a; }
    long long x1, y1;
    long long g = ext_gcd(b, a % b, x1, y1);
    x = y1;
    y = x1 - (a / b) * y1;
    return g;
}

// Phương trình ax ≡ c (mod m) có nghiệm khi gcd(a,m) | c
long long solve_linear(long long a, long long c, long long m) {
    long long x, y;
    long long g = ext_gcd(a, m, x, y);
    if (c % g != 0) return -1;
    long long mod = m / g;
    return (x % mod * (c / g) % mod + mod) % mod;
}

Định lý số dư Trung Hoa (CRT)

Hệ phương trình xri(modmi) với các mi đôi một nguyên tố cùng nhau có nghiệm duy nhất modulo M=mi:

pair<long long, long long> crt(long long r1, long long m1, long long r2, long long m2) {
    long long x, y;
    long long g = ext_gcd(m1, m2, x, y);
    long long lcm = m1 / g * m2;
    long long ans = (r1 + m1 * ((r2 - r1) % m2 * x % m2 + m2)) % lcm;
    return {ans, lcm};
}

// Hợp nhiều phương trình:
long long r = 0, m = 1;
for (auto [ri, mi] : equations) {
    auto [new_r, new_m] = crt(r, m, ri, mi);
    r = new_r; m = new_m;
}

Bảng công thức

Độ phức tạp
Kiểm tra nguyên tố O(N)
Sàng nguyên tố đến N O(NloglogN)
GCD O(logmin(a,b))
Extended GCD O(logmin(a,b))
Lũy thừa nhanh ab O(logb)
C(n,k)modp (precompute) O(N) build, O(1) query
CRT (2 phương trình) O(logmin(m1,m2))

Các chủ đề nâng cao — trang chi tiết

Trang này là cheatsheet số học nền tảng. Các kỹ thuật toán nâng cao có trang riêng:

Chủ đề Mô tả Trang
Hàm nhân tính & Sàng tuyến tính Tính hàm nhân tính (Euler phi, số ước...) cho mọi số đến N trong O(N) Hàm nhân tính
Miller-Rabin & Pollard's Rho Kiểm tra nguyên tố và phân tích thừa số cho N lớn (1018) Miller-Rabin & Pollard's Rho
Lucas & modular nâng cao (nk)modp với n rất lớn, CRT, Cipolla Lucas Theorem
Logarithm rời rạc (BSGS) Giải axb(modm) trong O(m) Baby-step Giant-step
Nhân ma trận Tăng tốc truy hồi tuyến tính với N1018 Matrix Exponentiation
Berlekamp-Massey Tìm truy hồi tuyến tính ngắn nhất của một dãy Berlekamp-Massey
FFT Nhân hai đa thức / tích chập trong O(NlogN) FFT
Nội suy Lagrange Khôi phục đa thức bậc N1 qua N điểm Nội suy Lagrange
Burnside & Polya Đếm cấu hình phân biệt dưới nhóm đối xứng Burnside và Polya
gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0