为什么取模尽量对质数取

先说结论:因为对质数取模之后的结果发生碰撞概率更小。

  • 很多时候为了解决数字超过存储上限问题,我们可以对该数取模然后存储,这就导致不同的数字可能取模后结果一致,也就是发生了碰撞,这时我们就需要对比原数字。
  • 首先,在求余数的时候,例如:a%b,我们希望取余后的数有可能是0-(b-1)之间任意的一个数,这样才能最大化取余之后的映射空间,减少碰撞
    • 而如果a,b有公约数c,那么取余后的结果只会是c的倍数:0,c,2c,3c等等,而取不到1-(c-1)(c+1)-(2c-1)中间的数,大大减少了映射空间
    • 例如:25%10=5,25%15=10,25%20=5等等
  • 那么这是为何?
    • 我们可以这样理解,我们将a和b都看做是水平x轴上的一个点,a%b就表示我们从b点开始往后跳,每次跳的步长固定是b,一直跳到下一跳后的位置超过a停止,此时余数就是a减去当前位置,例如25%15,15每次跳的步长就是15,此时它下一条是30超过了25,因此余数就是当前25-15=10
    • 25%15的时候,我们可以将每一跳的步长15看成是:步长为5每次必须跳3下,而5同时也是25的因子,因此25可以看成步长为5跳了5下
      • 此时5是他们的公共跳跃因子,也就是说25一定在5的某一跳上,而15每次跳完也只可能是在5的某一跳上
      • 那么此时当15的下一跳超过25的时候,他们中间的距离只可能是5的倍数,此时也就大大减少了映射空间
  • 而如果在a%b的时候b是个质数,那么a和b之间就没有公共跳跃因子,也就不会说他们的位置一定在一个因子的某一跳上,从而导致a%b结果只可能是该因子的倍数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一酒。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值