From b2cabb047d6c088332e9e0beb7e3e93527560703 Mon Sep 17 00:00:00 2001 From: Pragy Agarwal Date: Thu, 28 Nov 2019 18:16:02 +0530 Subject: [PATCH] Incomplete nCr --- ncr.md | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 ncr.md diff --git a/ncr.md b/ncr.md new file mode 100644 index 0000000..d81aa04 --- /dev/null +++ b/ncr.md @@ -0,0 +1,101 @@ +# Calculating ${n \choose r} \% m$ like a pro + +Let's begin with some prerequisites. + +## Modular arithmetic + +$(a \bmod m)$, also represented as $a \% m =$ remainder left when $a$ is divided by $m$. +Example: $10 \% 7 = 3$ + +### Properties of $\%$ +#### Distritbutive over addition & substraction $(\pm)$ + $$(a\pm b) \% m = \Bigl[ (a \% m ) \pm (b \% m) \Bigr] \% m$$ + $(8+13)\%7 = \Bigl[(8 \% 7) + (13 \% 7)\Bigr]\%7$ +$21\%7 = [1 + 6]\%7$ + $0 = 7 \% 7$ + $0 = 0$ +#### Distritbutive over multiplication $(\times)$ + $$(a \times b) \% m = \Bigl[ (a \% m ) \times (b \% m) \Bigr] \% m$$ + $(8 \times 13)\%7 = \Bigl[(8 \% 7) \times (13 \% 7)\Bigr]\%7$ + $104 \% 7 = [1 \times 6]\%7$ + $6 = 6 \% 7$ + $6 = 6$ + +- **NOT distributive over $\div$** + Unlike $+, -, \times$, the modulo operator does not distribute over division. + So, $\left (\dfrac ab \right )\%m \;\;\red \neq\;\; \left[\dfrac{a\%m}{b\%m}\right] \% m$. + However, the concept of **Modular Inverse** (discussed later) helps us simplify these calculations. + +## Calculating $(n! \bmod m)$ in $\mathcal O(n)$ time + +Since $\%$ distributes over $\times$, we can say that + +$$(n!) \% m = \Bigl[n (n-1)(n-2) \cdots 1\Bigr] \% m \\[.5em] +=\overbrace{\underbrace{{\underbrace{\overbrace{n \cdot (n-1)}^{\%m} \cdot (n-2)}_{\%m} \cdots} \cdot 2}_{\% m} \cdot 1}^{\%m}$$ + +So, we can simply calculate factorial, by taking $\%$ after every multiplication. +```python +def fact_mod(n, mod): + ans = 1 + for i in [1 .. n] + ans = (ans * i) % mod + return ans +``` + +## Binary Exponentiation: calculating $(n^p \bmod m)$ in $\mathcal O(\log_2 p)$ time +```python +def binary_exponentiation(n, p, mod): + if n == 0: return 0 + if p == 0: return 1 + ans = binary_exponentiation(n, p//2, mod) # note: integer division + ans = ans * ans + if p is even: + return ans + else: + return ans * n +``` + + + +## Fermat's Little Theorem +If $p$ is prime, then +$$a^p \equiv a \pmod p$$ + +## Euler's generalization to Fermat's Little theorem + +Iff $a$ and $m$ are co-prime, then +$$\boxed{a^{\phi(m)} \equiv 1 \pmod m}$$ + +**Let's break it down:** +- $a$ is coprime with $m$ iff $gcd(a, m) = 1$, that is, $a$ and $m$ do not have any common factor. +- If $a \bmod m = b \bmod m$, we say that $a \equiv b \pmod m$ +- $\phi(m)$ is the Euler's Totient Function for $m$ + +## Euler's Totient Function $\phi(m)$ +The Euler's Totient Function $\phi(m)$ counts the number whole numbers smaller than $m$ which are coprime with $m$ + +For example, if $m = 30$, then what numbers are coprime with $m$? +``` + 1 2 3 4 5 6 7 8 9 10 +11 12 13 14 15 16 17 18 19 20 +21 22 23 24 25 26 27 28 29 30 +----------------------------- + 1 7 +11 13 17 19 + 23 29 +----------------------------- +count = 8 +``` + +1. If $m$ is prime, + $$\boxed{\phi(m) = m - 1}$$ +2. If $m$ is not prime, then let us factorize $m$ + Let $m = p_1^{\alpha_1} \cdot p_2^{\alpha_2} \cdot p_3^{\alpha_3} \ldots$ + Then, + $$\boxed{\phi(m) = m \left (1 - \dfrac1 p_1 \right )\left (1 - \dfrac1 p_2 \right )\left (1 - \dfrac1 p_3 \right ) \cdots}$$ + +Example, +- if $m = 17$, $\phi(17) = 16$ +- if $m = 30 = 2^1 \cdot 3^1 \cdot 5^1$, then + $\phi(30) = 30 \left( 1 - \dfrac 1 2 \right )\left( 1 - \dfrac 1 3 \right )\left( 1 - \dfrac 1 5 \right )$ + $= 30 \cdot \dfrac12 \cdot \dfrac23 \cdot \dfrac45 = 8$