数论算法——等模

在散列函数中,有很多地方是根据模运算来进行散列,所以某两个整数都modn的值一样,这两个整数就可以看成是一个等价类的(比如某个简单的hash算法是槽值为模7的余数,那么模7余数相等的数就都是一个等价类的,都会被hash到同一个槽中)。

还比如:a,b∈Z,当且仅当a和b除以2的余数相同.这样所有的偶数都属于同一个等价类。(因为所有偶数除以2的余数为0)

这种关系用符号可以表示为:

a≡b(mod)n或a∈[b]n

表示a,b除以n的余数相等

 

我们经常需要面临的一个问题是:知道了整数a,正整数n。现在想知道a模n的等价类集合是什么?

一个的等价类是一个集合,比如a=3,n=7.我们可以找到3模7的等价类集合为{···,-11,-4,3,10,17,···}。

同理,根据这个等价类集合我们可以看出:-4模7的等价类集合也是这个集合。10模7的等价类集合也是这个集合······

 

我们一般用“每个等价类集合中最小的非负元素来表示该等价类集合”,即

{···,-11,-4,3,10,17,···}可以表示为[3]7

当然,这个“最小的非负元素”的规定也不是必须的,事实上{···,-11,-4,3,10,17,···}这个集合同时也可以表示为[-4]7或[10]7······

即:······=[-4]7=[3]7=[10]7=······={···,-11,-4,3,10,17,···}

 

在我们已知a和n的前提下,其实就可以根据以下公式找到a模n的等价类集合。该公式为:

[a]n = {a+k*n} k∈Z (这个公式可以很简单的推出,在此就不详讲了)

 

我们可以将这些等价类集合“再归纳成一个集合”,用“每个等价类集合中最小的非负元素来表示该等价类集合”即:

Zn = {[0]n,[1]n,······,[n-1]n} = {[a]n} 0<=a<=n-1

我们可以已Z7为例:

Z7={[0]7,[1]7,[2]7,[3]7,[4]7,[5]7,[6]7},所以这个集合里绝对不会有[10]7或[17]7等,因为[3]7已经代表了他的等价类集合了。

为了方便起见,我们可将Zn简化为:

Zn={0,1,······,n-1} (在这里面,0就表示[0]n······)

posted @ 2017-06-20 22:16  Red_Code  阅读(674)  评论(0编辑  收藏  举报