输出中的模运算

时间:2012-10-08 16:34:27

标签: c algorithm discrete-mathematics number-theory

在大多数编程竞赛中,假定程序的输出非常大,通常会指示将输出除以10000007(或者在这种情况下是素数)。采用素数的重要性是什么?因为在很多情况下我发现相同的数字是100004(即不是素数)..?

1 个答案:

答案 0 :(得分:5)

使用素数有两个原因。一个原因是整数模数形成一个数学领域。字段中的算术以许多方式工作,如整数算术。这使得字段在某些竞争问题中有用,否则所使用的序列在某些情况下可能会崩溃。某些算术可能产生零,其他微不足道的结果,或者比期望的更简单的结果,因为数字涉及模数因子,导致一些减少或消除。

另一个原因是迫使程序员处理一定大小的整数运算。如果使用了复合数,那么可以使用其他技术,而不使用大整数算法。

例如,假设我们想知道13 2 是什么模35,但我们只有一个非常小的处理器无法处理三位数,所以它无法计算13 2 = 169。

好吧,35 = 5•7,13与3模5和6模7一致。我们可以计算这些残差的平方,而不是计算13的平方,这告诉我们13 2 与3 2 = 9 = 4 modulo 5一致并且与6 2 = 36 = 1 modulo 7一致。组合这些残基需要一些额外的知识( Extended Euclidean Algorithm)。对于这些特定的数字,我们可以将5的残差乘以21,将7的残差乘以15得到4·21 + 1·15 = 99.减去模35得到29,这就是答案(13的残差< sup> 2 modulo 35)。

如果模数是素数,则无法绕过算术。质量模量基本上要求使用算术数字,直到模数的平方(或耗时的变通方法),但复合模数允许在较小的数字上使用算术,最多只有模数的两倍。