模块化算术
在数学中,模块化算术是整数的算术系统,在达到某个值时,数字“绕过”,称为模量。现代的模块化算术方法是由卡尔·弗里德里希·高斯(Carl Friedrich Gauss)在1801年出版的《 Arithmeticae》一书中开发的。
模块化算术的熟悉使用是在12小时的时钟中,其中一天分为两个12小时的时间。如果现在的时间是7:00,则8小时后将是3:00。简单的添加会导致7 + 8 = 15 ,但是15:00读为时钟面的3:00,因为每12小时“周围”时钟“缠绕”,而小时数到达12。我们说15与3 Modulo 12,书面15◦3(mod 12)相一致,因此7 + 8月3(mod 12)。同样,8:00代表8小时的时间,两倍,这将使16:00在时钟面上的读数为4:00,写为2×8月4(mod 12)。
一致
鉴于一个整数n > 1 ,称为模量,如果n是其差异的分裂,则据说两个整数A和B是一致的。也就是说,如果有一个整数k
- a - b = kn 。
一致性模量是一个一致关系,这意味着它是与加法,减法和乘法的操作兼容的等效关系。一致性模态表示
- A = B (mod n ) 。
括号意味着(mod n )适用于整个方程式,而不仅仅是右侧(在这里, b )。
该符号不应与符号b mod n (没有括号)(指莫多洛操作)相混淆,当将b的其余部分除以n :即, b mod n表示唯一的整数r ,使得0≤r < n和r韧(mod n ) 。
一致关系可能会被改写为
- a = kn + b ,
明确显示其与欧几里得分部的关系。但是,这里的b不必是n的剩余部分。相反, A = b (mod n )断言,当除以n时, a和b具有相同的剩余。那是,
- a = pn + r ,
- b = qn + r ,
其中0≤r < n是剩余的。我们通过减去这两个表达式并设置k = p - q来恢复先前的关系: a - b = kN 。
例子
在模量12中,可以断言:
- 38月14(mod 12)
因为差为38 - 14 = 24 = 2×12 ,所以12个倍数。同等地,当除以12时,有38和14的剩余2 。
一致性的定义也适用于负值。例如:
基本属性
一致性关系满足等价关系的所有条件:
- 反射性: a²A ( mod n )
- 对称性:如果b = a (mod n ),则a²b ( mod n ) 。
- 传递性:如果a²b (mod n )和bC (mod n ) ,则A = C (mod n )
如果a 1月1 (mod n )和a 2 b 2 (mod n ) ,或a²b ( mod n ) ,则:
- 任何整数K _ _ _
- 对于任何整数K
- 任何整数K _
- a 1 + a 2 b 1 + b 2 (mod n ) (与添加的兼容性)
- a 1- a 2 b 1 -b 2 (mod n ) (与减法的兼容性)
- a 1 a 2 b 1 b 2 (mod n ) (与乘法的兼容性)
- 任何非负整数k的a k b k (mod n )
- p ( a ) ◦p ( b )(mod n ) ,对于具有整数系数的任何多项式P ( x ) (与多项式评估的兼容)
如果a²b ( mod n ) ,则通常是错误的, k a月k b (mod n ) 。但是,以下是正确的:
为了取消共同术语,我们有以下规则:
- 如果a + k b + k (mod n ) ,其中k是任何整数,则是a。b (mod n ) 。
- 如果ka_kb ( mod n )和k与n相同,则是a。b (mod n ) 。
- 如果ka = kb (mod kn )和k ≠0 ,则是a²b ( mod n ) 。
最后一个规则可用于将模块化算术转移到除法中。如果b除了a ,则( a / b )mod n =( a mod bn ) / b 。
模块化乘法逆由以下规则定义:
- 存在:存在一个表示A -1的整数,使得aa -1¶1 (mod n )且仅当a与n是n是n时。该整数A -1称为模块n的模块化乘法逆。
- 如果存在a≥b (mod n )和a -1 ,则a -1 = b -1 (mod n ) (与乘法逆的兼容性,如果a = b ,则唯一性模态n )。
- 如果ax b (mod n )且a是与n相关的,则该线性一致性的解决方案由x a -a -1 b (mod n )给出。
使用扩展的欧几里得算法,可以通过求解Bézout的方程式AX + NY = 1来有效计算乘法逆X -a -1 (mod n ) 。
特别是,如果p是素数,则a是每个a的c coprime,以使得0 < a < p ;因此,对于所有与零模量p不一致的A的乘法逆存在。
高级属性
一致关系的一些更高级的属性如下:
- Fermat的小定理:如果P是元素,则不划分A ,则p -1 = 1(mod p ) 。
- Euler的定理:如果A和N为codrime,则Aφ ( n ) = 1(mod n ) ,其中φ是Euler的基本函数。
- Fermat的小定理的一个简单结果是,如果P是Prime,那么A -1 = A P -2 (mod P )是0 < a < p的乘法逆。更一般而言,从Euler的定理(如果A和N为coprime),则A -1 = aφ ( n )-1 (mod n ) 。
- 另一个简单的结果是,如果φb ( modφ ( n )) ,其中φ是欧拉的基本函数,则ka²kb ( mod n ) ,前提是k是n coprime 。
- Wilson的定理: P是素数,并且仅在( P - 1)时! ◦-1(mod p ) 。
- 中文定理:对于任何a , b和coprime m , n ,存在一个唯一的x (mod mn ) ,使得x = a (mod m )和x = b (mod n ) 。实际上, x = bm n -1 m + a m -1 n (mod mn ) ,其中m n -1是m modulo n和n m -1的倒数,是n个模量m的倒数。
- Lagrange的定理:一致性f ( x )◦0(mod p ) ,其中p为prime, f ( x )= a 0 x n + ... + a n是具有整数系数的多项式(mod p ) ,最多具有N根。
- 原始的根模量n :一个数字g是一个原始的根模量,如果对于每个整数a coprime到n ,则有一个整数k ,使得g k k g a (mod n ) 。当n等于2,4, p k或2 p k时,存在原始的根模量,其中p是奇数码数,而k是一个正整数。如果存在原始的根模量,则完全存在此类原始根( φ ( φ ( n )) ,其中φ是Euler的基本函数。
- 二次残基:如果存在整数X ,则整数A是二次残基模量N ,以便x 2 = a (mod n ) 。 Euler的标准断言,如果p是奇数,而a不是p的倍数,则a是一个二次残基modulo p ,仅当且仅当
- a ( p -1)/2 1(mod p ) 。
一致性课
一致性关系是等效关系。整数A的等效类模拟是A + KN的所有整数的集合,其中K是任何整数。它称为模量n的一致性类或残基类,可以表示为mod n ) ,或者在从上下文中知道模量n时为a或[ a ] 。
每个残基类模块n完全包含一个整数,范围为0,..., n -1 。因此,这些n个整数是其各自残留类别的代表。
与整数合作通常比整数集更容易。也就是说,代表最常考虑的代表,而不是其残留类别。
因此, (一个mod n )通常表示唯一的整数k ,因此0≤k < n和k程a (mod n ) ;它称为模量的残留物。
特别是( a mod n )=( b mod n )等效于a = b (mod n ) ,这解释了为什么在这种情况下通常使用“ = ”而不是“ ◦ ”。
残留系统
每个残基类模量可以由其任何一个成员表示,尽管我们通常以最小的非负整数表示每个属于该类别的残基类(因为这是由除法产生的适当余数)。不同残留类别模拟的任何两个成员都是不一致的模量。此外,每个整数都属于一个和一个残基类模量。
整数集{0,1,2,..., n -1}称为最小残基系统模拟。任何n个整数,其中两个都是一致的模量,称为完整的残基系统模量。
残留系统最小的是一个完整的残基系统,完整的残留系统只是包含每个残基类模量的一个代表的集合。例如,残留系统最小的模拟4为{0、1、2、3} 。其他一些完整的残留系统模型4包括:
- {1, 2, 3, 4}
- {13, 14, 15, 16}
- {−2, −1, 0, 1}
- {−13, 4, 17, 18}
- {−5, 0, 6, 21}
- {27, 32, 37, 42}
一些未完成残基系统模型4的集合是:
- {-5、0、6、22} ,因为6与22 Modulo 4相一致。
- {5,15} ,因为一个完整的残基系统模拟4必须完全具有4个不一致的残基类。
残留系统减少
鉴于Euler的基本函数φ ( n ) ,任何相对质量到n且在模量n下相互不一致的φ ( n )整数都称为减少残基系统模量n 。例如,从上方开始的集合{5,15}是降低的残基系统modulo 4的实例。
覆盖系统
覆盖系统代表了可能包含带有不同模量的残基的另一种类型的残基系统。
整数模块
整数的所有一致性类别的模量n的集合称为整数模量,并表示为或。但是,不建议使用该符号,因为它可以与N-Adic整数集混淆。该戒指是数学各个分支的基础(请参见下面的§应用程序)。
该集的定义为n > 0为:
(当n = 0时,不是一个空的集合;而不是同构,因为a0 = {a}。)。
我们通过以下规则定义加法,减法和乘法:
验证这是正确的定义,使用之前给出的属性。
这样,变成了一个交换戒指。例如,在戒指中,我们有
就像在24小时时钟的算术中一样。
我们使用符号,因为这是理想的商环,一个包含n可以排除的所有整数的集合,singleton集合{0}。因此,是一个最大理想的领域(即n是素数时)。
仅在加法操作下,这也可以从组中构建。残基类A是商组中A的组固定组,一个环状组。
与其排除特殊情况n = 0,不如包含在内(如前所述,与整数是同构)。实际上,在讨论环的特征时,此包含是有用的。
当且仅当n为prime时,整数模块的环是一个有限的字段(这确保每个非零元素都有一个乘法逆)。如果n = pk是具有k> 1的主要力量,则存在一个唯一的(达到同构)有限的字段,但这不是一个元素,因为它具有零分离器,因此无法成为一个字段。
整数的乘法亚组被表示。这是一个(a是共符号n)的组成,它们正是具有乘法逆的类。在乘法下,这形成了一个交换组,并以φ(n)顺序形成。
扩展到实数
申请
在纯数学中,模块化算术是数字理论的基础之一,几乎涉及其研究的每个方面,并且也广泛用于群体理论,环理论,结理论和抽象代数。在应用数学中,它用于计算机代数,密码学,计算机科学,化学以及视觉和音乐艺术。
一个非常实际的应用是计算序列号标识符中的校验和。例如,国际标准簿号(ISBN)使用Modulo 11(用于10位ISBN)或Modulo 10(对于13位ISBN)算术算术进行错误检测。同样,例如,国际银行帐号(IBANS)使用Modulo 97算术来发现银行帐户中的用户输入错误。在化学中, CAS注册表的最后一个数字(每种化合物的唯一识别号)是一个支票数,它是通过获取CAS注册号的前两个部分的最后两个部分,即先前的数字来计算的时间2,以前的数字时间3等,添加所有这些并计算总和模量10。
在密码学中,模块化算术直接基于RSA和DIFFIE -HELLMAN等公共密钥系统,并提供了有限的领域,这些领域是椭圆曲线的基础,并用于各种对称密钥算法,包括先进的加密标准(AES),国际数据加密算法(AES)(AES)(AES)(AES)想法)和RC4 。 RSA和Diffie -Hellman使用模块化指数。
在计算机代数中,模块化算术通常用于限制中间计算和数据中整数系数的大小。它用于多项式分解,该问题所有已知的有效算法都使用模块化算术。它是由多项式最大的常见分裂,精确的线性代数和Gröbner基础算法在整数和合理数字上使用的。正如1980年代在Fidonet上发布的,并在Rosetta Code上存档,模块化算术被用来证明Euler在Sinclair Ql微型计算机上使用CDC 6600超级计算机使用的整数的四分之一来代替sinclair Ql QL微型计算机的总和。通过蛮力搜索。
在计算机科学中,模块化算术通常应用于涉及固定宽度,环状数据结构的其他操作中。在许多编程语言和计算器中实现的Modulo操作是模块化算术的应用,通常在这种情况下使用。逻辑运算符XOR总和2位Modulo 2。
在音乐中,算术模量12用于考虑十二色相等气质的系统,其中八度和雷神等效性发生(即,以1:2或2:1的比例俯仰,比率是等效的,C -夏普是被认为与D-平面相同)。
抛弃九的方法可以快速检查手工执行的十进制算术计算。它基于模块化算术模量9,特别是基于10一(mod 9)的关键属性。
算术模量7用于确定给定日期的一周中的算法。特别是, Zeller的一致性和世界末日算法大量使用Modulo-7算术。
更普遍地,模块化算术在法律(例如,分配),经济学(例如游戏理论)和社会科学领域等学科中也有应用,在这些学科中,比例的分裂和资源分配是分析的核心部分。
计算复杂性
由于模块化算术具有如此广泛的应用,因此必须知道解决一致性系统的难度很重要。可以在多项式时间内以高斯消除形式在多项式时间内解决线性系统,有关详细信息,请参见线性一致性定理。还存在算法,例如蒙哥马利还原,以允许简单的算术操作(例如乘法和指示模量)在大量上有效地执行。
某些操作,例如找到离散对数或二次一致性似乎与整数分解一样困难,因此是加密算法和加密的起点。这些问题可能是NP中级。
求解非线性模块化算术方程的系统是NP完整的。
示例实现
以下是三个合理快速的C函数,两个用于执行模块化乘法,另一个用于在未大于63位的无签名整数上进行模块化指数,而没有瞬态操作的溢出。
一种计算AÅb (mod m )的算法:
uint64_t mul_mod(uint64_t a, uint64_t b, uint64_t m) {
if (!((a | b) & (0xFFFFFFFFULL << 32))) return a * b % m;
uint64_t d = 0, mp2 = m >> 1;
int i;
if (a >= m) a %= m;
if (b >= m) b %= m;
for (i = 0; i < 64; ++i) {
d = (d > mp2) ? (d << 1) - m : d << 1;
if (a & 0x8000000000000000ULL) d += b;
if (d >= m) d -= m;
a <<= 1;
}
return d;
}
在计算机体系结构上,具有至少64位Mantissa的扩展精度格式(例如,大多数X86 C编译器的长双重类型),以下例程比使用环路的解决方案要快,通过采用以下技巧,该技巧是硬件,浮点乘法会导致产品中最重要的位置,而整数乘法导致保留最低的位置:
uint64_t mul_mod(uint64_t a, uint64_t b, uint64_t m) {
long double x;
uint64_t c;
int64_t r;
if (a >= m) a %= m;
if (b >= m) b %= m;
x = a;
c = x * b / m;
r = (int64_t)(a * b - c * m) % (int64_t)m;
return r < 0 ? r + m : r;
}
以下是用于执行模块化指数的C函数,该函数使用上面实现的MUL_MOD函数。
计算A B (mod m )的算法方法:
uint64_t pow_mod(uint64_t a, uint64_t b, uint64_t m) {
uint64_t r = m == 1 ? 0 : 1;
while (b > 0) {
if (b & 1) r = mul_mod(r, a, m);
b = b >> 1;
a = mul_mod(a, a, m);
}
return r;
}
但是,对于所有上述程序的工作, M不得超过63位。