模數加法形成了一種數學結構,成為阿貝爾群(Abelian group),這是以丹麥數學家阿貝爾的名字命名的。
定義1. 設\(a,b\in Z\),如果存在\(q\in Z\)使得\(a=qb\),則稱\(b\)整除\(a\),記為\(b|a\)。
定義2. 設\(a,b\in Z\),\(b>0\),\(a=qb+r\),\(q\in Z\),\(0\leq r<b\),則稱\(r\)為\(a\)除以\(b\)所得到的餘數,記為\(a\bmod b\)。
定義3. 設\(a,b,n\in Z\),\(n>0\),如果\(a\bmod n=b\bmod n\),則稱\(a\)與\(b\)模\(n\)同餘,記為\(a \equiv b\pmod{n}\)。
定理1. \(\forall a,b,n\in Z, n>0, a\equiv b\pmod{n}\)等價於\(n|(a-b)\)。
定理2.
定義4. 設\(n\in Z\),\(n>0\),\(\forall x\in Z\),定義\([x]=\{y|y\equiv x \pmod{n}\}\),稱為整數集\(Z\)上在模\(n\)同餘的等價關係下的一個等價類。
例.
模\(4\)同餘關係的所有等價類為:
定理3. 設\(n\in Z\),\(n>0\),\(\forall x,y\in Z\),\([x]=[y]\)當且僅當\(x\equiv y\pmod{n}\)。
在\(Z_n\)上定義加法運算「\(+\)」如下:
\(\forall [i],[j]\in Z_n,[i]+[j]=[i+j]\),則\((Z_n,+)\)構成一個交換群;
在\(Z_n\)上定義乘法運算「\(*\)」如下:
$ \forall [i],[j]\in Z_n,[i][j]=[ij]\(,則\)(Z_n,*)$構成一個交換么半群。
證明:
\(\forall i,j,i',j'\in Z\),如果\([i]=[i']\),\([j]=[j']\),則\([i+j]=[i'+j']\),這驗證了「\(+\)」為一個運算。
\(\forall i,j,k\in Z\),\(([i]+ [j])+ [k]=[i+j]+ [k]=[(i+j)+k]\),\([i]+ ([j]+ [k])=[i]+ [j+k]=[i+(j+k)]\),\(([i]+ [j])+ [k]=[i]+ ([j]+ [k])\),這驗證了加法運算\(+\)滿足結合律。
\(\forall i\in Z\),\([0]+[i]=[i]+[0]=[i]\),這驗證了\([0]\)為單位元。
\(\forall i\in Z\),\([n-i]+[i]=[i]+[n-i]=[n]=[0]\),這說明\([i]\)有逆元。
以上驗證了\(Z_n\)對於加法運算「\(+\)」構成一個群。
證明:
\(\forall a,b,c\in Z'_n,(a\oplus b)\oplus c=a\oplus (b\oplus c)\),結合律。
\(((a+b)\bmod n+c)\bmod n=(a+(b+c)\bmod n)\bmod n\)
\(((a+b)\bmod n+c)\bmod n=(a+b+c)\bmod n\)
\((a+(b+c)\bmod n)\bmod n=(a+b+c)\bmod n\)
\(0\oplus a = (0+a)\bmod n = a\)
如果\(a\neq 0\),則\((n-a)\oplus a = (n-a+a)\bmod n = 0\);\(0\oplus 0=(0+0)\bmod n=0\)。
設用\(n\)個二進位制位表示一個整數\(x\),\(x\)的二補數定義為:
如果\(x\geq 0\),則\(x\)的二補數為\(x\)的原碼;
如果\(x < 0\), 則\(x\)的二補數為\(x+2^n\)的原碼。
設用8個二進位制位表示一個整數,計算7和-7的二補數。
解:
因為\(7\geq 0\),因此7的二補數為7的原碼,即7的二補數為0000_0111。
因為\(-7 < 0\),因此-7的二補數為\(-7+2^8\)的原碼,即-7的二補數為1111_1001。
\(-7\)的二補數還可以這樣求解:
設用8個二進位制位表示一個整數,計算-128的二補數。
解:
因為\(-128 < 0\),因此-128的二補數為\(-128+2^8\)的原碼,即-128的二補數為1000_0000。
同樣的,\(-128\)的二補數還可以這樣求解:先計算128的原碼,得到1000_0000,然後取反加1,得到\(-128\)的二補數為1000_0000。
如果用\(n\)個二進位制位表示一個整數,用二補數表示的數位的範圍為\(-2^{n-1}\sim 2^{n-1}-1\)。
對於二補數而言:
如果用8個二進位制位表示一個整數,00001010為哪個整數的二補數?10001010為哪個整數的二補數?
解:
計算機中普遍採用二補數表示數位的原因是對於負數的加法可以採用與自然數的加法一樣的加法器 。
設\(x\)和\(y\)為任意的兩個整數,分以下4種情況討論:
相信大家一開始學習二補數的時候都是記為取反加一,然而在看了本篇部落格後,你或許明白了為什麼是這樣的。
設\(x\)為任意一個8位元有符號整數(char),也就是說它的二進位制位數為8位。
現在我們研究下 -1。
二補數這樣的連續性使得我們在進行有符號數加減法時不需要考慮其他運算規則,直接相加即可。
二補數所表示的數,我們通常這樣計算:
設表示的數為\(w\) ,二進位制數表示為\(s_ns_{n-1}s_{n-2}····s_{2}s_{1},即\)\(s_i (1 \le i \le n)\), \(s_n\)為符號位。
則
表示非負數很好理解,就是進位制轉換。
那麼負數為什麼要有負權呢?為什麼最高位代表的權值是負的?
現在,讓你設計一個正數負數都可以表示的運算系統,你會想到令一位為標誌位 (Flag),來特殊地表示這個數是正數還是負數。
那麼,電腦科學家們是先想到這樣的程式設計思想(Flag位),還是先由近世代數進一步研究發現的呢?
我認為是由近世代數這樣的思想進一步推廣研究發現的。
毫無疑問,二補數這些性質奠定了電腦科學的基礎。
這篇部落格主要參考我的近世代數老師的講義,他在上課時說,他當時在研究生推免答辯就問為什麼計算機中要用二補數,結果沒有人答得上來。
參考資料:王義和.離散數學引論[M].哈爾濱:哈爾濱工業大學出版社,2007
本文來自部落格園,作者:江水為竭,轉載請註明原文連結:https://www.cnblogs.com/Az1r/p/16968337.html