前言:
本文爲密碼學的數學基礎(王小雲版)讀書筆記,僅做了一些自認爲重要些的筆記,如有錯誤,歡迎指正.
同餘五大性質(重要)
a和b關於正整數m同餘等價於存在正整數k,使得a−b=km,記做:a≡b(mod m),原書中同餘有七大性質,本文省去兩個,其他內容均以此五大性質爲基礎,因而需要深刻理解.
- 同餘式可以相加減, 即若有
a≡b(modm),c≡d(modm)則:a±c≡b±d(modm)
- 同餘式可以相乘,即若
a≡b(modm),c≡d(modm)
則有
ac≡bd(modm)
- (非常重要) 設 d⩾1,d∣m, 若同餘式a≡b(mod m) 成立, 則
a≡b(modd)
- 若 m⩾1,(a,m)=1, 則存在 c 使得
ca≡1(modm)
我們把 c 稱爲 a 對模 m 的逆, 記作 a−1(modm).
可以根據歐幾裡得演算法得到.具體實現程式碼可見上一篇部落格.
- 同餘式組
a≡b(modmj),j=1,2,⋯,k
同時成立的充要條件是 a≡b(mod[m1,⋯,mk])
公倍數一定是最小公倍數的乘積,加上性質3可以推出.
例2.5 設 n 爲整數, 試求出它能被 9 整除的充要條件.
解 設 n=a010k+⋯+ak−110+ak. 因爲 10i≡1(mod9),1⩽i⩽k, 所以
由同餘性質 1, 2 得
n≡a0+a1+⋯+ak(mod9)
故
9∣a0+a1+⋯+ak⇔9∣n
從例 2.5 同樣也可以推出 n 被 3 整除的充要條件爲 3∣a0+a1+⋯+ak, 這就 是我們早已熟知的判斷整數能否被 3 整除的方法.
(既約)剩餘類,(既約)剩餘系
(既約)剩餘類:
給定正整數m,所有對m同餘的陣列成的集合稱爲模m的一個剩餘類,以r表示m的一個剩餘類,如果(r,m)=1,則稱r爲模m的一個既約(或互素)剩餘類,模m的所有既約剩餘類的個數記作φ(m),即爲我們常見的Euler函數
(既約)剩餘系:
關於m的所有(既約)剩餘類的集合稱爲模m的(既約)剩餘系.
- m個數完全剩餘系(通常稱爲剩餘系)的充要條件爲m個數兩兩對m不同餘
- φ(m)個數組成m的既約剩餘系的充要條件爲,φ(m)個數對m不同餘,且均與m互素.
構造方法(部分方法,有待補充)
定理 2.13 設 m=m1⋯mk, 且 m1,⋯,mk 兩兩既約. 再設 m=mjMj,1⩽j⩽k, 及
x=M1x(1)+⋯+Mkx(k)
那麼 x 遍歷模 m 的完全(既約)剩餘系的充要條件是 x(1),⋯,x(k) 分別遍歷 m1,⋯,mk 的完全 (既約) 剩餘系.
通常用於構造一個大數的(既約)剩餘系,可以根據此定理進行分解大數,然後進行一一組合,最終得到大數的(既約)剩餘系.爲方便程式設計與檢視結果,我利用m=m1m2,這一假設作爲前提,進行C語言程式碼實現,執行結果一覽:
完整程式碼如下:
#include<iostream>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b)
{
if (!b)
return a;
return gcd(b, a % b);
}
ll* residual_system(ll m1, ll m2)
{
if (gcd(m1, m2) != 1)
{
cout << "m1與m2不互素,輸入錯誤!" << endl;
exit(-1);
}
ll M2 = m1, M1 = m2;
ll* R = (ll*)malloc((m1 * m2+1) * sizeof(ll));
if (!R)
exit(-1);
ll* Temp = R;
ll x,x1=0,x2=0,m=m1*m2;
for (x1 = 0; x1 < m1; ++x1)
{
for(x2 = 0; x2 < m2; ++x2)
{
x = (M1 * x1 + M2 * x2) % m;
*Temp = x;
Temp += 1;
}
}
*Temp= -1;
return R;
}
ll* Irreducible_residue_system(ll m1, ll m2)
{
if (gcd(m1, m2) != 1)
{
cout << "m1與m2不互素,輸入錯誤!" << endl;
exit(-1);
}
ll M2 = m1, M1 = m2;
ll* R = (ll*)malloc((m1 * m2+1) * sizeof(ll));
if (!R)
exit(-1);
ll* Temp = R;
ll x, x1 = 0, x2 = 0, m = m1 * m2;
for (x1 = 0; x1 < m1; ++x1)
{
if (gcd(x1, m1) != 1)
continue;
for (x2 = 0; x2 < m2; ++x2)
{
if (gcd(x2 ,m2) != 1)
continue;
x = (M1 * x1 + M2 * x2) % m;
*Temp = x;
Temp += 1;
}
}
*Temp = -1;
return R;
}
int main()
{
ll m1 = 5, m2 = 7;
ll* R = residual_system(m1, m2);
cout <<m1 * m2<< "的完全剩餘係爲:" << endl;
for (ll i = 0;R[i]!=-1; i++)
{
if (!(i % m1)&&i!=0)
cout << '\n';
cout << R[i] << '\t';
}
m1 = 6;
m2 = 5;
ll* R2 = Irreducible_residue_system(m1, m2);
cout <<'\n'<<m1*m2<< "的既約剩餘係爲:" << endl;
for (ll i = 0; R2[i] != -1; i++)
{
if (!(i % m1) && i != 0)
cout << '\n';
cout << R2[i] << '\t';
}
return 0;
}
Euler定理,Wilson定理
定理描述與證明
模 m 的既約剩餘系可以取種種不同的形式,但不難看出每個既約剩餘系中所 有數的乘積模 m 是不變的, 即若 {r0,⋯,rφ(m)−1},{r0′,⋯,rφ(m)−1′} 是模 m 的兩
個既約剩餘系, 那麼必有
j=1∏φ(m)rj≡j=1∏φ(m)rj′(modm)
由此就可得到下面 下麪著名的Euler 定理.
Euler 定理 設 (a,m)=1, 則有
aφ(m)≡1(modm)
證明 : 取 r0,⋯,rφ(m)−1 是模 m 的一組既約剩餘系,由定理 2.11 :
設 a,b 是任意整數,且 (a,m)=1, 那麼,x 遍歷模 m 的一組 完全剩餘系時, ax + b 也遍歷模 m 的一組完全剩餘系。
知:
當 (a,m)=1 時, ar0,⋯,arφ(m)−1 也是模 m 的既約剩餘系,同時
因此
j=0∏φ(m)−1rj≡j=0∏φ(m)−1(arj)≡aφ(m)j=0∏φ(m)−1rj(modm)
由於 (rj,m)=1,j=0,⋯,φ(m)−1, 所以
aφ(m)≡1(modm)
Wilson 定理設 p 是素數, r1,⋯,rp−1 是模 p 的既約剩餘系,則
rmodp∏r≡r1⋯rp−1≡−1(modp)
特別地有
(p−1)!≡−1(modp)
證明…有時間再補充,主要思路爲利用配對思想進行配對
Euler定理應用:
歐拉定理是費馬小定理的推廣和一般化,常見的應用如下:
1.RSA公鑰密碼體制
在計算機領域中廣泛使用的RSA公鑰密碼演算法也正是以歐拉函數爲基礎的。基於歐拉定理及大數的素因子分解極爲困難而提出的RSA公鑰密碼體制在1977年由羅納德·李維斯特、阿迪·薩莫爾和倫納德·阿德曼一起提出。RSA加密體制廣泛應用於資訊保安領域中的資訊加密和數位簽名,其應用原理是產生一對金鑰,一個爲使用者所保留,另一個則可以爲任意使用者獲得,並且很難通過一個金鑰去獲取另一個金鑰,從而保證公鑰體制的安全性。
(1)演算法簡介。設p,q爲兩個保密的充分大的質數,n=pq,則φ(n)=(p-1)(q-1);取一個整數e,滿足1<e<φ(n),且滿足(e,φ(n))=1;求出e關於φ(n)的逆元d,使得ed=1(mod φ(n));則可以(d,n)爲金鑰,以(e,n)爲公鑰,或者以(e,n)爲金鑰,以(d,n)爲公鑰.隨即銷燬p與q。
加解密的方法爲加密:C=Me(mod n)其中M表示明文,C表示密文。解密:M=Cd(mod n)其中M表示明文,C表示密文。要證明這樣的加解密方式是可行的,只需證明:對任意整數k,有ked=k(mod n)這等價於kmφ(n)+1=k(mod n)若(k,n)=1,則原式等價於(kφ(n))m=1(mod n),顯然成立;若k=mp,原式等價於(mp)αφ(n)+1m=m(mod q),與前面相同;若k爲n倍數,則顯然成立。則證畢。通常用公鑰加密,金鑰解密。
(2)RSA的優缺點。RSA演算法是目前理論上最爲完善的公鑰密碼體制,是公鑰密碼體制中最優秀、影響最大的加密演算法。RSA的安全性是基於大整數素因子分解的困難性,在理論上一直未能得到證明。RSA經歷了各種攻擊,至今未能被完全攻破。但數學上至今未能證明分解就是攻擊RSA的最佳方法,不排除今後有發現多項式時間內分解的演算法。並且,囿於素數產生技術的限制,生產亂數的程式必須不能給攻擊者任何資訊,即保證隨機性與不可預測性,故生產金鑰的複雜度也較高。另外,由於進行的都是非常大的數的計算,RSA的速度不可避免地被拖慢,比對應同樣安全級別的對稱密碼演算法慢近1000倍。
2.羣論中的運用
在羣論中的運用有限回圈羣生成元個數的計算公式可以用歐拉函數表出。G爲回圈羣是指G的每個元都是G的某一固定的元a的乘方,即對於任何≤n且與n互素的正整數r,αr是G的生成元。若G是n階回圈羣,則G含有φ(n)個生成元。
Wilson定理應用:
Wilson定理的應用常用於計算化簡以及一些證明題中,見習題1第(2)問.
習題
題目描述
- 設素數 p 爲奇數, 證明:
- [ 1 ] . 當 p=4m+3 時, 對任意整數 a 均有 a2≡−1(modp)
- [ 2 ]. 當 p=4m+1 時, 必有整數 a 滿足 a2≡−1(modp).
- 設 m=m1m2⋯mk,m1,m2,⋯,mk 兩兩既約, (m,ai)=1. 證明: = 當 x(i) 分別遍
歷 mi 的完全 (既約) 剩餘系時,
x=(M1a1x(1)+M2+⋯+Mk)(M1+M2a2x(2)+⋯+Mk)⋯(M1+M2+⋯+Mkakx(k))
x=m11a1x11+m2a2x12…nkkan
參考思路
(1).反證法:假設成立,存在 a 使 a2≡−1 (modp), then ap−1≡a2(2m+1)≡(−1)2m+1≡−1(modp), since p=2 這與歐拉定理矛盾,得證.
(2) Let a=(2m)!, then
a2=(1×2×⋯×2m)(1×2×⋯×2m)≡(1×2×⋯×2m)[(−1)(p−1)×(−1)(p−2)×⋯×(−1)(2m+1)](modp)≡(−1)2m(p!)(modp)≡−1(modp)(非常巧妙地運用了Wilson定理)
2.待補充…
參考論文:孫焱. 歐拉函數的性質及簡單應用[J]. 商情, 2017, 000(048):288.