同余的应用

来源:互联网 发布:java string byte 互转 编辑:程序博客网 时间:2024/04/20 06:18

1. 散列函数

可以为计算机文件分配内在地,最常用的散列函数之一是  h(k) = k mod m,m是可用内内存的数目

例如,以客户的社会安全号作为记录,当 m= 111 时,

h(064212848) = 064212848 mod 111 = 14

h(037149212) = 037149212 mod 111 = 65

由于散列函数不是一对一的,有可能多个记录分配到同一个内存地址,这时就说出现了冲突,消解冲突的一个办法是使用散列函数给出的但已经被占用的地址后面第一个未占用的地址。


2. 伪随机数

生成伪随机数的过程称为线性同余法。选择4个数:模数m,乘数a,增量c,和种子x0,使得 2<= a <m,0<= c <m, 0<= x0 <m。生成办法是逐次同余 

xn+1 = (a*xn + c) mod m , 有时要求产生0和1之间的伪随机数,可以用线性同余法生成的数除以模数。

例如 m = 9, a = 7, c = 4, x0 = 3

x1 = 7x0 + 4 mod 9 = 7 * 3 + 4 mod 9 = 25 mod 9 = 7

x2 = 7x1 + 4 mod 9 = 7 * 7 + 4 mod 9 = 53 mod 9 = 8

x3 = 7x2 + 4 mod 9 = 7 * 8 + 4 mod 9 = 60 mod 9 = 6

……

x 9 = 7x8 + 4 mod 9 = 7 * 5 + 4 mod 9 = 39 mod 9 = 3

由于x9 = x0 而且每一项都只依赖于其前面一项,所以产生的序列如下

3 7 8 6 1 2 0 4 5 3 7 8 6 1 2 0 4 5 3 ……

大部分计算机的确使用线性同余法生成 伪随机数。常使用的线性同余发生器的增量 c = 0,这样的发生器称为"纯乘式发生器",例如以2^31 - 1为模,以7^5 = 16807为乘数的纯乘式发生器就广为采用,可以证明以这些值来计算,会产生2^32 - 2个数,然后开始重复。


3. 密码学

已知最早使用密码的例子之一是凯撒。使用数学来表达凯撒加密过程,就按照字母在字母表中的位置,用0到25的数表示字母,加密方式用函数 f 表示,对每个非负整数p,p<= 25,函数  f(p) = (p + k) mod 26 是将每个字母移动k位,例如 f(p) = (p + 3) mod 26,将每个字母移动3位,解密可以为加密的反函数,f`(p) = (p - k) mod 26

凯撒的方法和移位密码不能提供高度安全,稍稍提高一下安全度的方法是使用 f(p) = (ap + b) mod 26 这样的函数。例如 f(p) = (7p + 3) mod 26

凯撒的加密法及其扩展都是用字母表中的一个字母代替另一个,这类加密法很容易受到根据字母在信息中出现的频率作出攻击。



(以上内容来自《离散数学及其应用》第6版)


原创粉丝点击