Skip to content

Introduction

Congruence

Congruence modulo n is a congruence relation, meaning that it is an equivalence relation that is compatible with the operations of addition, subtraction, and multiplication. Congruence modulo n is denoted :

$$ a \equiv b [n] $$

The congruence relation may be rewritten as (k ∈ ℤ):

$$ a = b + k \times n $$

More information on Wikipedia.org.

Practical example

$$ 12 \equiv 3 [9] $$

$$ 21 \equiv 3 [9] $$

$$ -6 \equiv 3 [9] $$

Because :

$$ 12 = 3 + 1 \times 9 $$

$$ 21 = 3 + 2 \times 9 $$

$$ -6 = 3 - 1 \times 9 $$

In python, you can use the % symbol.

>>> 12 % 9 == 21 % 9 == -6 % 9 == 3
True

Addition and substraction

$$ 12 \equiv 3 [9] $$

You can add or substract any number. Example with +3 and -5 :

$$ 15 \equiv 6 [9] $$

$$ 7 \equiv -2 [9] $$

The last equivalence is equals too (sometimes it's easier to deal with positive numbers):

$$ 7 \equiv 7 [9] $$

Multiplication

$$ 12 \equiv 3 [9] $$

You can multiply with any number € Z (you cannot make a division, ex: multiply by 1/2).

1. Example with * 3 :

$$ 36 \equiv 9 [9] $$

Which is equals to :

$$ 0 \equiv 0 [9] $$

$$ 36 - 9 * 4 = 9 - 9 * 1 $$

2. Example with * -5 :

$$ -60 \equiv -15 [9] $$

Which is equals to :

$$ 3 \equiv 3 [9] $$

$$ -60 + 9 * 7 = -15 + 2 * 9 $$

Divsion (warning)

You can't divise a equivalence relation.

$$ 12 \equiv 2 [10] $$

Divide by 2 :

$$ 6 \not\equiv 1 [10] $$

Modular inverse

The multiplicative inverse :

$$ x * a \equiv 1 [n] $$

$$ x * a + n * k = 1 $$

$$ x \equiv a^{-1} [n] $$

It may be efficiently computed by solving Bézout's equation a * x + n * k = 1 using the Extended Euclidean algorithm (used to compute the GCD - Greatest common divisor).

Practical example

$$ 5 \times x \equiv 1 [34] $$

$$ 5 \times x = 1 + 34 \times k $$

$$ 1 = 5 \times 7 - 34 $$

You can use the modular inverse in Python :

$$ 5 \equiv x^{-1} [34] $$

>>> pow(5, -1, 34)
7
>>> from Crypto.Util.number import inverse
>>> inverse(5, 34)
7
>>> from gmpy2 import invert
>>> invert(5, 34)
mpz(7)