求模运算为什么推荐用素数

结论

  • 如果哈希数据是均匀随机分布的,那么用质数和合数是没区别的。
  • 但实际上哈希数据往往不是均匀分布的,比如存在很多等差数列(例如1,4,8,9,12,16,17这组数中就包含等差数列4,8,12,16)。
  • 而这种情况使用合数会增加冲突概率,下面我会详细阐述原因。

先验知识

  • 合数:指大于 1 的自然数,除了 1 和它本身以外,还有其他的正因数。
  • 素数/质数:指大于 1 的自然数,除了 1 和它本身以外,没有其他的正因数。
  • 哈希函数: H( c ) = c % N。

实验

  • 这部分我们举例实际开发中可能存在的几组数据,然后将其分别映射到一个大小为素数7,一个大小为合数8的哈希表中,哈希函数采用上面提到的。
  • 数据选择从1开始,一共十个元素的的等差数列,通过映射到不同大小的哈希表的冲突数量,体现效果。

数据1

(1,2,3,4,5,6,7,8,9,10)这组等差数据的差为1,从1开始。

哈希表大小为7(冲突数为3)

余数0123456
123456
78910

哈希表大小为8(冲突数为2)

余数01234567
1234567
8910

数据2

(1,3,5,7,9,11,13,15,17,19)这组等差数据的差为2,从1开始。

哈希表大小为7(冲突数为3)

余数0123456
135
791113
151719

哈希表大小为8(冲突数为4)

余数01234567
1357
9111315
1719

结论分析

由上面的实验可以看到,哈希表的大小选择为偶数的时候,一旦数据中存在有规律的数据,其冲突的可能性将大大增加,数据分布不均匀。而素数大小的哈希表其冲突的情况比较均匀,即使数据有规律。因此很多用到哈希表的数据结构中为了保证程序的鲁棒性会选择用素数作为哈希表的大小。

原因分析

假设哈希表的大小为M,是一个偶数。当用M取模时,M的任意一个因子k, 都存在等差数列,其模空间会缩小为M/k, 从而增加冲突概率。 例如用8取模时,其因子4存在等差数列4, 8, 12,16…,这个数列的余数空间是(4,0,4,0,…) 。因此,取质数是最安全的选择,因为它的因子最少。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
求一个模n的逆元,可以使用扩展欧几里得算法来求解。步骤如下: 1. 首先判断模数n是否为质数,如果n为质数,则可以使用费马小定理来计算模n的逆元。费马小定理是:a^(n-1) ≡ 1 (mod n),则a的逆元为a^(n-2) (mod n)。 2. 如果n不是质数,则需要使用扩展欧几里得算法来求解。扩展欧几里得算法可以求出两个整数a和b的最大公约数gcd(a,b),并且可以求出一组整数x和y,使得ax + by = gcd(a,b)。 3. 在模n的意义下,如果a和n互质,则可以使用扩展欧几里得算法求出a在模n意义下的逆元x。具体地,如果gcd(a,n) = 1,则ax ≡ 1 (mod n),则可以求出一个整数x,使得ax + ny = 1,因此x就是a在模n意义下的逆元。 4. 如果a和n不互质,则a在模n意义下没有逆元。因此,需要判断a和n是否互质。 下面是一个使用扩展欧几里得算法求解模n的逆元的C语言程序: ```c int mod_inverse(int a, int n) { int gcd = gcd_extended(a, n); if (gcd != 1) { // a和n不互质,a在模n意义下没有逆元 return -1; } else { // a在模n意义下的逆元 int x = (x % n + n) % n; // 处理负数情况 return x; } } int gcd_extended(int a, int b, int *x, int *y) { if (a == 0) { *x = 0; *y = 1; return b; } int x1, y1; int gcd = gcd_extended(b % a, a, &x1, &y1); *x = y1 - (b / a) * x1; *y = x1; return gcd; } ``` 其中,gcd_extended函数是扩展欧几里得算法的实现,mod_inverse函数使用扩展欧几里得算法求解模n的逆元。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值