一
问题是这样的,给出一个正整数A, B, 如果A/B的结果小数位数有限的(非无限循环小数)则称A/B是可以除尽的
那么,朴素做法就是算余数,然后看余数是否存在循环节,判断它是不是可以除尽的,复杂度还是可以的。
有没有更高端的算法呢?
结论 : 1.对于2个互质的正整数A, B(B≠1),如果B含有除2,5以外的素因子,则A/B是不可以除尽的
2.对于2个不互质的正整数A, B, 只需要约分成2个互质的然后返回结论1即可。
证明和推导就很简单了,我们可以模拟手算除法的过程,每一次将A/B得到一个余数,然后余数*10再与B进行mod运算,因为A,B互质,所以如果要使一次计算的余数为0,那么B一定是2或5的倍数,这可以看成是余数每次多一个2和5的素因数因子,B是2或5的倍数就保证了总有一次计算使得余数的2,5因子乘积可以被B整除,余数就变成了0
上述算法只需要做一次gcd,然后判断B/gcd(A,B)是否仅含有2和5的素因子即可。另一种做法是素因数分解,细节的话YY一下就好了。
推论的话就是如果B的素因子仅含有2和5,那么A/B是一定可以除尽的,算物理数学题很有用的结论。
思考:任取2个正整数A和B,则它们可以除尽的概率是多少?(这个我也没YY出来)
二
如果A/B可以除尽,那么循环节的长度是多少呢?(挖坑中)
第二个问题是A/B若不可以除尽,那么循环节的长度是多少呢?
比如说5/3的结果是1.6666666…… 显然循环节的长度是1。
既然牵扯到循环节我们便可以暴力模拟算,时间复杂度还是可以接受的。
那有没有更好的算法呢?
我们观察到 10 mod 3 = 1, 10*10 mod 3 = 1, 10*10*10 mod 3 = 1
这里就是欧拉定理的东西了
也就是 a^φ(B) ≡ 1 (mod B) ←← 欧拉定理
那么 10^φ(B) ≡ 1 (mod B) (前提:10和B是互质)
φ(B)是欧拉函数,表示小于B的正整数中与B互质的正整数的个数
我们可以想一下,如果10和B互质,意味着B中没有2和5的因子,因为不可以被除尽,那么B中肯定没有2和5的因子,所以10与B互质,那么我们就得到了一个大致的循环节,这个循环节的长度为φ(B)-1.
证明在这里←←
因为10^φ(B) ≡ 1 (mod B), 所以10^2φ(B) ≡ 1 (mod B)
φ(B)到2φ(B)-1是一个循环节,所以循环节的长度为φ(B)-1。
不过这只是一个大致的循环节,可以保证它是一个循环节,但是无法证明它是最小循环节,啊。。这个还是过几天再填坑吧,有大神的话可以想一下告诉我答案~
后方施工中= = ~