पाठ 37 / 42

Math & Number Theory

GCD, primality, और Sieve of Eratosthenes — interviews के लिए बार-बार आने वाला number-theory टूलकिट।

Euclid's algorithm से GCD

gcd(a, b) == gcd(b, a % b), अंत में gcd(x, 0) == x तक। LCM आता है a * b / gcd(a, b) से।

def gcd(a, b):
    while b:
        a, b = b, a % b
    return a

def lcm(a, b):
    return a * b // gcd(a, b)

Output:

gcd(48, 18)  # 6
lcm(4, 6)    # 12

Primality परीक्षण

Trial division को केवल sqrt(n) तक divisors जांचने की ज़रूरत है — square root से बड़े किसी भी factor का एक छोटा जोड़ीदार factor होता है।

def is_prime(n):
    if n < 2:
        return False
    i = 2
    while i * i <= n:
        if n % i == 0:
            return False
        i += 1
    return True

Output:

is_prime(97)   # True
is_prime(100)  # False

Sieve of Eratosthenes

n तक के सभी primes खोजने के लिए, हर prime के गुणकों को p*p से शुरू करके composite चिह्नित करें। यह O(n log log n) में चलता है — हर number को अलग-अलग जांचने से कहीं तेज़।

def sieve(n):
    is_composite = [False] * (n + 1)
    primes = []
    for p in range(2, n + 1):
        if not is_composite[p]:
            primes.append(p)
            for multiple in range(p * p, n + 1, p):
                is_composite[multiple] = True
    return primes

Output:

sieve(30)
# [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

Modular arithmetic

बड़े परिणामों के लिए, हर multiplication/addition के बाद % (10**9 + 7) लगाएँ ताकि overflow न हो। याद रखें: (a * b) % m == ((a % m) * (b % m)) % m