同余(英語:Congruence modulo[1],符號:≡)在数学中是指數論中的一種等價關係[2]。當两个整数除以同一个正整数,若得相同余数,则二整数同余。同餘是抽象代數中的同餘關係的原型[3]。最先引用同余的概念与「≡」符号者为德國数学家高斯。
可以證明所有对于模同餘的整數對構成一個(整数系上的)等价关系,換句話說,對於任意兩個整数,:
- (1)
- (2)
- (3)
故以下的集合
可稱為对于模的同余類(congruence class或residue class),也可標記為;模在上下文很清楚時,也可簡記為。會被稱為該同余類的代表數(representative)[4]。
剩餘系[5][6](英語:residue system)亦即模同餘類的代表數的集合,通常使用的代表數是最小非負整數,因為它是除法中的應當餘數。要注意的是,對於同一個模數,不同的同餘類不等價,亦即,屬於不同同餘類的整數不同餘於模數,或者說,模剩餘系中的任二元素不同餘於模;而且,整數域中的每個整數只屬於模數的一個同餘類,因為模將整數域划分為互斥區塊,每個區塊是一個同餘類。
一個完全剩餘系(英語:complete residue system)指的是模的全部同餘類的代表數的集合;因為剩餘系中的任二元素不同餘於模,所以它也稱為非同餘餘數的完整系統(英語:complete system of incongruent residues)。例如,模有三個同餘類,其完全剩餘系可以是。如果該集合是由每個同餘類的最小非負整數所組成,亦即,則稱該集合為模的最小剩餘系(英語:least residue system)。
模完全剩餘系中,與模互質的代表數所構成的集合,稱為模的簡約剩餘系(英語:reduced residue system),其元素個數記為,亦即欧拉函数。例如,模的簡約剩餘系為或。如果模是質數,那麼它的最小簡約剩餘系是,只比最小剩餘系少一個。
(即是說 a 和 b 之差是 m 的倍數)
換句話說,[註 1]
同余可以用来检验一个数是否可以整除另外一个数,见整除规则。
k為整數,n為正整數,
每個正整數都可以分解為數個因數的乘積,稱為整数分解。例如 ,因數 與 都可以整除 ,記為 與 。如果 可以整除某正整數 ,亦即 ,那麼 就是 的因數:,其中 為另一因數。,因此, 的因數也可以整除 :。
等價於 ,也就是 。亦即,如果 ,那麼它可以寫成 ,因此有以下除法原理:
- 的因數也可以整除 。亦即, 是 的倍數:,。因為 ,所以 。
- [註 1]
- 現假設 可以整除 的倍數 。如果 和 互質(記為 ),那麼 必定可以整除 :。
- [註 3]
- 如果 而且 ,那麼 與 的最小公倍数必定可以整除 ,記為 。這可以推廣成以下性質:
- [註 4]
- 上面的最後一個性質可以使用算术基本定理與集合來解釋。一個大於1的正整數 可以分解為一串質數冪的乘積:( 兩兩相異,且),令 為所有能整除 的質數冪的集合,即 。設 為正整數,則 整除 ,當且僅當 是 的子集。令 且 ,則 與 的聯集必定也是 的子集。取這個聯集中冪次最高的各個元素,它們的乘積就是 與 的最小公倍数。事實上,有 ,所以 也能夠整除 。
可用輾轉相除法、歐拉定理、卡邁克爾函數求解。
存在最小的正整数d使得成立,且。
考虑最大公约数,有解时用輾轉相除法等方法求解。
先求解每一个线性同余方程,再用中国剩余定理解方程组。
勒让德符号、雅可比符号、克罗内克符号、二次互反律用于判别d是否为模n的二次剩余。
- 求自然数a的个位数字,就是求a与哪一个数对于模10同余。
- 。
模數算術在數論、群論、環論、紐結理論、抽象代數、計算機代數、密碼學、計算機科學、化學、視覺和音樂等學科中皆有應用。
它是數論的立基點之一,與其各個面向都相關。
模數算術經常被用於計算標識符中所使用的校验和,比如国际银行账户号码(IBANs)就用到了模97的算術,來捕獲用戶在輸入銀行帳戶號碼時的錯誤。
於密碼學中,模數算術是RSA與迪菲-赫尔曼密钥交换等公鑰系統的基礎,它同時也提供有限域,應用於 橢圓加密,且用於許多對稱密鑰加密中,包括高级加密标准、國際資料加密演算法等。
於計算機科學, 同餘被應用於位元運算或其他與固定寬度之循環資料結構相關的操作。
於化學中, CAS號(一個對各種化合物皆異之的識別碼)的最後一碼為校驗碼,將CAS號首二部分最後的數字乘上一,下一碼乘上二,下一碼乘上三以此類推,將所有積加起來再取模10。
在音樂領域,模12用於十二平均律系統。
星期的計算中取模7算術極重要。
更廣泛而言,同餘在法律、經濟(見賽局理論)或其他社會科學領域中也有應用。
以下為快速展示小於63位元無號整數之模數乘法的C程式,且轉換過程中不發生溢位。計算 a * b (mod m)之演算法:
uint64_t mul_mod(uint64_t a, uint64_t b, uint64_t m)
{
uint64_t d = 0, mp2 = m >> 1;
int i;
if (a >= m) a %= m;
if (b >= m) b %= m;
for (i = 0; i < 64; ++i)
{
d = (d > mp2) ? (d << 1) - m : d << 1;
if (a & 0x8000000000000000ULL)
d += b;
if (d > m) d -= m;
a <<= 1;
}
return d%m;
}
张鸿林; 葛显良 (编). 英汉数学词汇. 清华大学出版社. 2005: 119, 617.