İçeriğe atla
ΣDSA Patterns
Menü
Dil

Kalıp #32

Matematik & Sayı Teorisi

Önerilen

Modüler aritmetik, asallar, GCD/LCM, kombinatorik, sieve.

Ne zaman kullanılır

Bölünebilirlik, asallar, modüler üs alma, GCD/LCM veya kombinatorik (n choose k, faktöriyel mod m) içeriyorsa kullan.

Tanıma ipuçları

  • Modül aritmetiği / (a^b) mod m
  • Asal sayma / Eratosthenes kalburu
  • İki sayının GCD/LCM
  • n choose k mod m / Catalan sayıları

Yaygın tuzaklar

  • Ara çarpımlarda overflow (erken ve sık mod al)
  • Fermat küçük teoremi asal modül gerektirir
  • Kalbur boyutu vs indeks off-by-one

90 saniyelik tanıma egzersizi

Hangisi en iyi uyuyor?

  • Modül aritmetiği / (a^b) mod m
  • Asal sayma / Eratosthenes kalburu
  • İki sayının GCD/LCM

Etkileşimli

Zihinsel model

Değişmezin tam adım adım anlatımı. Duraklat, noktalara tıkla veya ← → kullan. Her adımı kendi cümlelerinle anlatmayı hedefle.

Adım 1 / 7
48
18

gcd(a,b) = gcd(b, a % b)

Euclid ile GCD: gcd(48, 18) = gcd(18, 12) çünkü 48 = 2·18 + 12.

Nasıl düşünülür

Sayı teorisi problemleri aritmetiği modül altında güvenli tutup çarpımsal yapıyı sömürme becerini sınar. İki alışkanlık çok önemlidir: (1) her çarpmadan sonra % m al ki ara çarpımlar taşmasın; (2) modüler üs alma (ikili üs alma: square-and-multiply) ile a^b mod m’yi O(log b)’de hesapla, asla naif pow çağırma.

Asallar için Eratosthenes kalburu varsayılan: n+1 boyutunda boolean dizi, her asalın katlarını p*p’den başlayarak çiz. GCD için Öklid algoritması tek satırdır: gcd(a, b) = b === 0 ? a : gcd(b, a % b). LCM a / gcd(a, b) * b’dir (önce böl, taşmayı önle). n choose k mod m için faktöriyeller ve ters faktöriyeller mod m önhazırla (m asalsa Fermat).

Şablon şekilleri

Şekil Temel hamle Örnek
Modüler üs Square-and-multiply, her adımda mod LC 50, LC 372
Kalbur Boolean dizi, p*p’den çiz LC 204
GCD / LCM Öklid: gcd(b, a % b) LC 1071, LC 365
Faktöriyel / bölünebilirlik Sıfır sayımı, faktör sayma, kombinatorik mod m LC 172

Karmaşıklık temeli

Modüler üs: O(log b). Kalbur: O(n log log n). GCD: O(log min(a, b)). Önhazırlanan faktöriyeller: O(n) kurulum, sorgu başına O(1).

Şablondan probleme

  1. İşlemi tanımla: üs, asal testi, GCD veya kombinatorik.
  2. Modülü belirle, asal mı (Fermat geçerli)? Büyük mü?
  3. Overflow önlemek için her adımda % m al.
  4. Yalnızca problem birçok sorguyu amorti ediyorsa (faktöriyeller, kalbur) önhazırla.

Şablon

TypeScript, Python ve C#’te aynı iskelet. Değişmezi uyarla; yapıyı koru.

Matematik & Sayı Teorisi · Şablon
/** Math template: modular exponentiation + GCD via Euclid. */

export function modPow(base: number, exp: number, mod: number): number {
  let result = 1n;
  let b = BigInt(base) % BigInt(mod);
  const m = BigInt(mod);
  let e = BigInt(exp);
  while (e > 0n) {
    if (e & 1n) result = (result * b) % m;
    b = (b * b) % m;
    e >>= 1n;
  }
  return Number(result);
}

export function gcd(a: number, b: number): number {
  a = Math.abs(a); b = Math.abs(b);
  while (b) { [a, b] = [b, a % b]; }
  return a;
}

export function lcm(a: number, b: number): number {
  if (a === 0 || b === 0) return 0;
  return Math.abs(a) / gcd(a, b) * Math.abs(b);
}
/** Math template: modular exponentiation + GCD via Euclid. */

export function modPow(base: number, exp: number, mod: number): number {
  let result = 1n;
  let b = BigInt(base) % BigInt(mod);
  const m = BigInt(mod);
  let e = BigInt(exp);
  while (e > 0n) {
    if (e & 1n) result = (result * b) % m;
    b = (b * b) % m;
    e >>= 1n;
  }
  return Number(result);
}

export function gcd(a: number, b: number): number {
  a = Math.abs(a); b = Math.abs(b);
  while (b) { [a, b] = [b, a % b]; }
  return a;
}

export function lcm(a: number, b: number): number {
  if (a === 0 || b === 0) return 0;
  return Math.abs(a) / gcd(a, b) * Math.abs(b);
}
#DurumProblemTürBitti
  1. 1#50 Pow(x, n)Rehber
  2. 2#172 Factorial Trailing ZeroesRehber
  3. 3#204 Count PrimesRehber
  4. 4#365 Water and Jug ProblemRehber
  5. 5#372 Super PowRehber
  6. 6#1071 Greatest Common Divisor of StringsRehber