• 数论算法——等模


    在散列函数中,有很多地方是根据模运算来进行散列,所以某两个整数都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······)

  • 相关阅读:
    Runoob-JSP:JSP 表单处理
    Runoob-JSP:JSP 状态码
    Runoob-JSP:JSP 服务器响应
    extundelete
    Java实现 洛谷 P1601 A+B Problem(高精)
    Java实现 洛谷 P1601 A+B Problem(高精)
    Java实现 洛谷 P1601 A+B Problem(高精)
    Java实现 洛谷 P1508 Likecloud-吃、吃、吃
    Java实现 洛谷 P1508 Likecloud-吃、吃、吃
    Java实现 洛谷 P1508 Likecloud-吃、吃、吃
  • 原文地址:https://www.cnblogs.com/red-code/p/7056605.html
Copyright © 2020-2023  润新知