python 取余 韩信点兵_韩信点兵问题的神算法

本文详细介绍了韩信点兵问题的数学定理和解法,通过将两个变量合并成一个变量,简化了求解过程。利用定理1和定理2,可以求出一个数除以两个互质数后的最小值。尽管对于大数计算可能增加计算量,但定理3提供了一种优化方法,即使面对大数也能保持较低的计算复杂度。
摘要由CSDN通过智能技术生成

韩信点兵问题的神解法

定理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值