2 l6 N8 c& k1 v q; T! iA - a ´ k + b ´ k = A + (b - a) ´ k % k5 @- i, f" h3 j* Z
! h" ?4 u1 L- y/ B# m) g5 ~. C* e$ N
留意在這裏,除非錯誤發生在第一個位的英文字母上,否則 (b - a) 的絕對值和k都祇會是 1 至 10 之間的數字,不會大於 11,故此 (b - a) ´ k 這個部分,不可能被 11 整除。但因為 A 本身可以被 11 整除,所以整個核對值 A + (b - a) ´ k,便不能被 11 所整除了。由此可以知道輸入的資料有錯。" W! M& R# \- `6 Q0 P
/ t4 `0 K& N2 z1 m+ k
當然,應用核對值的方法有一個死穴,就是頭一個字母如果錯入了一個和原本字母相隔 11 個位的字母,例如:將 “H856249(2)” 錯入成 “S856249(2)”(其核對值為 308,可以被 11 整除),那麼電腦亦無法知道到輸入的資料有錯了。不過,相信發生如此錯誤的機會極之小,所以這個方法亦相當可靠。 , @4 s# p6 @& ~1 j! M6 ?* A9 Y/ U$ C3 P3 m3 l2 Q' z
還有,如果輸入資料時出現 2 處或以上的錯誤,例如:將 “H856249(2)” 錯入成 “H856049(A)”,我們亦無法將錯誤檢查出來。(當然,如果太容易出現 2 處的輸入錯誤,那麼我認為最佳的解決辦法,就是辭退那位輸入員,改聘另一位更可靠的人選了!)1 e ?$ B1 _9 g7 X
5 _3 S9 l5 ~$ x% Z2 w9 g' F
另一個秘密 $ _% F8 o; ~+ h4 d& f( s留意在上面的討論中,那個位值倍數其實沒有多大的作用。事實上,如果我們不乘上任何倍數而直接將所有數位加起來,再定出一個核對數位,我們依然可以檢查出輸入資料時(1 處)的錯誤。那麼,我們為甚麼需要加入這個位值倍數呢?* p0 G9 G5 o: Z
4 Z% y4 i H0 n) \- \, }. j原來這亦是用來防止一般人一個容易犯上的錯誤,這就是誤將其中的兩個數字的位置對調。例如:將 “H856249(2)” 錯誤地變成 “H856294(2)”。 % H. U t7 B9 D; ^! m6 |; @8 F/ E3 o
我們再假設正確身份證號碼的核對值為 A,第 k 位的數字為 a,第 k + n 位的數字為 b(a ¹ b;n ³ 1),如果我們錯誤地將 a、b 兩個數字對調了,那麼該核對值便會變成 ( j7 D5 Z! E$ L9 o! W, i8 ]4 C7 J* @8 {/ g E( m
A - a ´ k - b ´ (k + n) + a ´ (k + n) + b ´ k = A + (a - b) ´ n 5 [, o6 g O9 Y: u, l! A" ]- t; I. t7 F5 y
同理,a、b 和 n 都祇會是 0 至 9 之間的數字,故此 (a - b) ´ n 這個部分,以至是整個核對值,都不能被 11 所整除,由此可以知道輸入的資料有錯了。留意如果沒有這個位值倍數,我們就無法偵測出這種錯誤了。, i O2 J! ^/ o! Y' D7 @$ k