韩信点兵问题的神解法
定理
1
:一个数除以
a
余数
x
,除以
b
余数
y
,
a
、
b
互质且
a
,求这个数的最小值。
设这个数为
z
,则
z=b(an+x-y)/(b-a)+y
(1)
或
z=a(bn+x-y)/(b-a)+x
(2)
其中
n
为使
(bn+x-y)/(b-a)
为正整数的最小值。
证明:
设
z=al+x=bm+y
则:
al+x-y-am=(b-a)m
所以
m=(a(l-m)+x-y)/(b-a)
将变量
l-m
用独立变量
n
代替:
m= (an+x-y)/(b-a)
将
m
代入以上等式得到:
z=b(an+x-y)/(b-a)+y
同理可以证明等式
2
定理
2
:在定理
1
等式中,
0<=n<=b-a
。
证明:从定理
1
等式中可知
n=l-m
,因为
a
,所以
l>=m
,故
n>=0
假设
n=h(b-a)+k
,
k<=b-a
代入以上算式
z=b(ah(b-a)+ak+x-y)/(b-a)+y=ahb+b(ak+x-y)/(b-a)
,
由
此可知,
n
可以取值为
k
。
根据以上两个定理来计算韩信点兵问题,具有两个方面的优点:
1
、
将两个变量合并成了一个变量,从而只需要尝试一个变量即可。
2
、
这一个变量的范围被两个除数的值界定,需要尝试的最多次数是确定的。
例
1
:一个数除以
9
余
5
,除以
13
余
4
,求这个数的最小值
列出算式:
13*(9n+5-4)/(13-9)+4=13*(9n+1)/4+4
显然能让相除结果为整数的
n
的最小值为
3
,代入则得:
13*(9*3+1)/4+4=95
。
例
2
:一个数除以
13
余
10
,除以
17
余
5
,求这个数的最小值
列出算式:
17*(13n+10-5)/(17-13)+5=17*(13n+5)/4+5
显然能让相除结果为整数的
n
的最小值也为
3
,代入则得:
17*(13*3+5)/4+5=192
以上算法比传统算法更简便,
但依然有缺陷,
即如果除数的值比较大时,
要获得满足条件的
n
的值尝试的次数也会相应增大,从而对于大数相除时也会计算量太大,无法手算,用计算
机计算也会比较耗时。
以下介绍一种即使对大数计算也非常有效的方法,
无论多大的数,
计
算量都增加很少。
首先证明两个定理:
定理
3
:
在定理
1
中,
z=b(an+x-y)/(b-a)+y
,必存在一个
m
,使得
z= b(am+(x-y)mod(a))/(b-a)+y
。