一、特殊整除数的证明
1.1 对3取模
定理一:一个整数如果能被3整除,则其各位数相加能被3整除。
证明:设整数N每个位上的数分别为an、an-1、
⋯
\cdots
⋯ 、a1、a0,则
N
=
∑
i
=
0
n
−
1
a
i
∗
1
0
i
N = \sum_{i=0}^{n-1} a_i*10^i
N=i=0∑n−1ai∗10i而
10
≡
1
(
m
o
d
3
)
10 \equiv 1 (mod3)
10≡1(mod3),则
1
0
i
≡
1
(
m
o
d
3
)
10^i\equiv1 (mod3)
10i≡1(mod3),故有
N
≡
∑
i
=
0
n
−
1
a
i
∗
1
0
i
(
m
o
d
3
)
=
∑
i
=
0
n
−
1
a
i
(
m
o
d
3
)
\begin{aligned}N &\equiv \sum_{i=0}^{n-1} a_i*10^i (mod3)\\&=\sum_{i=0}^{n-1}a_i(mod3)\end{aligned}
N≡i=0∑n−1ai∗10i(mod3)=i=0∑n−1ai(mod3)因而一个整数对3取模,结果即为其各位上的数之和对3取模。
1.2 被7整除
定理二:一个整数如果能被7整除,记其最高位到十位组成的数为a,个位数为b,则(a-2b)能被7整除。
例:对于861,百位和十位组成86,个位数是1, 86 − 2 ∗ 1 = 84 = 7 ∗ 12 86-2*1=84=7*12 86−2∗1=84=7∗12
证明:设整数N最高位到十位组成的数为a,个位数为b,则
N
=
10
∗
a
+
b
N=10*a+b
N=10∗a+b,若N能被7整除,则
N
≡
10
∗
a
+
b
≡
0
(
m
o
d
7
)
N\equiv10*a+b\equiv0\enspace(mod7)
N≡10∗a+b≡0(mod7)即:
10
∗
a
≡
−
b
(
m
o
d
7
)
10*a\equiv -b\enspace(mod7)
10∗a≡−b(mod7)
而
10
m
o
d
7
=
3
10mod7=3
10mod7=3,故
(
10
∗
a
)
m
o
d
7
=
(
3
∗
a
)
m
o
d
7
(10*a)mod7=(3*a)mod7
(10∗a)mod7=(3∗a)mod7,则有
3
∗
a
≡
−
b
(
m
o
d
7
)
3*a\equiv -b\enspace(mod7)
3∗a≡−b(mod7)两边乘5:
15
∗
a
≡
−
5
b
(
m
o
d
7
)
15*a \equiv -5b \enspace (mod7)
15∗a≡−5b(mod7)而
15
m
o
d
7
=
1
15mod7 = 1
15mod7=1故
a
≡
−
5
b
(
m
o
d
7
)
a\equiv -5b\enspace(mod7)
a≡−5b(mod7)则可以得到
a
−
2
b
≡
−
7
b
(
m
o
d
7
)
≡
0
(
m
o
d
7
)
\begin{aligned}a-2b &\equiv -7b\enspace (mod7)\\&\equiv0\enspace(mod7)\end{aligned}
a−2b≡−7b(mod7)≡0(mod7)命题得正。
二、16进制推广
2.1 对x取模
分析1.1中情况,可知3在十进制中取模特殊性来源于
1
0
n
m
o
d
3
=
1
10^nmod3=1
10nmod3=1。因而在16进制中,对应的数x应满足
16
≡
1
(
m
o
d
x
)
,
x
⩽
16
16 \equiv 1(mod\enspace x), x\leqslant16
16≡1(modx),x⩽16易知
x
x
x的一个值是
x
=
5
x=5
x=5。
验证:
(
8
C
2
B
)
16
=
(
35883
)
10
(8C2B)^{16}=(35883)^{10}
(8C2B)16=(35883)10,8+C+2+B=
(
21
)
16
=
(
33
)
10
(21)^{16}=(33)^{10}
(21)16=(33)10,二者对5取模均为3。
另外,
x
=
3
x=3
x=3与
x
=
15
x=15
x=15也满足该条件,这里不再讨论。
2.2 被x整除
分析1.2中情况,假设16进制中,一个整数N若能被b整除,设其最高位到次低位组成的数为x,则x-ay也能被b整除。
由此得出方程组:
{
m
o
d
(
16
,
b
)
=
c
m
o
d
(
c
∗
k
,
b
)
=
1
a
+
k
=
b
\left\{\begin{aligned}&mod(16,b)=c\\&mod(c*k,b)=1\\&a+k=b\\\end{aligned}\right.
⎩
⎨
⎧mod(16,b)=cmod(c∗k,b)=1a+k=b
其中
a
,
b
,
c
,
k
<
16
a,b,c,k < 16
a,b,c,k<16
直接遍历所有情况:
for b = 1:15
c = mod(16,b);
for k = 1:15
if(mod(c*k,b)==1)
for a = 1:15
if(a+k==b)
fprintf("Number found:a=%d,b=%d,k=%d\r\n",a,b,k);
end
end
end
end
end
得到所有解:
验证(以a=2,b=11为例):
N
=
(
65
F
7
)
16
=
(
26013
)
10
,
26103
=
11
∗
2373
N=(65F7)^{16}=(26013)^{10},26103=11*2373
N=(65F7)16=(26013)10,26103=11∗2373
(
65
F
−
2
∗
7
)
16
=
(
651
)
16
(65F-2*7)^{16}=(651)^{16}
(65F−2∗7)16=(651)16651是否被7整除不易直接得出,重复以上步骤
(
65
−
2
∗
1
)
16
=
(
63
)
16
=
(
99
)
10
≡
0
(
m
o
d
11
)
(65-2*1)^{16}=(63)^{16}=(99)^{10}\equiv 0\enspace (mod11)
(65−2∗1)16=(63)16=(99)10≡0(mod11)验证成功。其他解亦可,这里不一一验证。
2.3 特殊取模数的应用
在剩余数系统(Residue Number System,RNS)中,使用一系列模数来表示一个较大的数(如用剩余数5,7,11将23表示为{3,2,1})。一个数进入剩余数系统进行计算时,需要求出其对特定剩余数的模。
当输入数字的范围比较小时,可以直接用查找表的方法实现。当范围较大时,为提高效率,可以设置一系列特殊的剩余数,使得能够以较高的效率求出输入数字对这些剩余数的模。在FPGA中,基于16进制的运算环境下,在2.1中描述的条件下,3太小,5符合条件,15是5的整数倍(不满足剩余数互质的条件),因此较好的选择是5。
在2.2中描述的条件下,由于只能验证剩余数的整数倍,不能直接求输入对其的模,因而要找到与输入最近的剩余数的倍数,从而求出输入对剩余数的模,具体思想如下(以 ( C 75 B ) 16 (C75B)^{16} (C75B)16对11取模为例):
- 要找到与 ( C 75 B ) 16 (C75B)^{16} (C75B)16最接近的11的倍数,可以先找出与 ( C 75 ) 16 (C75)^{16} (C75)16最接近的11的倍数,再调整最后一位,使其满足2.1所述条件。而找出与 ( C 75 ) 16 (C75)^{16} (C75)16最接近的11的倍数,又可以转化成找到与 ( C 7 ) 16 (C7)^{16} (C7)16最接近的11的倍数,由于两位数已经是一个可以接受的范围,直接将所有16进制两位数中11(B)的倍数存在查找表中。可知与 ( C 7 ) 16 (C7)^{16} (C7)16最接近的11的倍数是 ( C 6 ) 16 (C6)^{16} (C6)16。
- ( C 6 ) 16 = ( C 7 − 1 ) 16 (C6)^{16}=(C7-1)^{16} (C6)16=(C7−1)16,将减数加减11使其转化为偶数,得到一个11的倍数: ( C 7 − 12 ) 16 (C7-12)^{16} (C7−12)16。而按2.1所述方法,要将 ( C 7 − 2 ∗ 5 ) 16 (C7-2*5)^{16} (C7−2∗5)16调整到11的倍数 ( C 7 − 12 ) 16 (C7-12)^{16} (C7−12)16,需要将最低位5调整到6,因而 ( C 76 ) 16 (C76)^{16} (C76)16是11的倍数
- 重复以上步骤。 ( C 76 ) 16 = ( C 75 + 1 ) 16 (C76)^{16}=(C75+1)^{16} (C76)16=(C75+1)16是11的倍数,则 ( C 75 − 10 ) 16 (C75-10)^{16} (C75−10)16是11的倍数,要将 ( C 75 − 2 ∗ B ) 16 (C75-2*B)^{16} (C75−2∗B)16转化为 ( C 75 − 10 ) 16 (C75-10)^{16} (C75−10)16,需要将最低位B调整到5。因此得到 ( C 755 ) 16 (C755)^{16} (C755)16是最接近 ( C 75 B ) 16 (C75B)^{16} (C75B)16 的11的倍数。(这个说法不严谨, ( C 755 ) 16 (C755)^{16} (C755)16是 ( C 75 B ) 16 (C75B)^{16} (C75B)16左边最大的11的倍数,可以用同样的方法求得 ( C 75 B ) 16 (C75B)^{16} (C75B)16右边最小的11的倍数,不过两个随便哪一个都可以得到 ( C 75 B ) 16 (C75B)^{16} (C75B)16对11的模)
验证: ( C 755 ) 16 = ( 51029 ) 10 = ( 51029 ) 10 = 11 ∗ 4639 10 (C755)^{16}=(51029)^{10}=(51029)^{10}={11*4639}^{10} (C755)16=(51029)10=(51029)10=11∗463910,方法得证。