所以,假设我有一个数字 123456。123456 % 97 = 72。如何确定需要在 123456 的末尾添加哪些两位数字,以便新数字 % 97 = 1?注意——它必须始终是两位数。
例如,123456 76 % 97 = 1。在这种情况下,我需要在数字末尾添加数字“76”。
(这是用于 IBAN 号码计算。)
x = 123456
x = x * 100
newX = x + 1 + 97 - (x % 97)
编辑:把 100 放在错误的地方
您计算 123456 00到 97 的模数并将 (97 - that + 1) 添加到该数字。所以你得到了 RoBorg 上面解释的清洁剂 :)
这是您需要的方程式
X = Y -(Number*100 mod y) - 1
在哪里:
Number = 123456
Y = 97
X the number you need
假设我们必须接收包含 12 位数字的号码。
第 1 步:写任意 10 位的随机数,即比所需的少 2 位,例如 1234567890 - 这是 X
第 2 步:X * 100 = 123456789000. '123456789000' - 这是 Y
第 3 步:Y / 97 = '1272750402.061856'。'06' - 这是 Z
第 4 步:97 - Z + 1 = 92。'92' - 这是 W
第 5 步:最终交易编号为 X,后跟 W,即“123456789092”
可接受的数字示例:100000000093 100000000190 100000000287 等。
模算术实际上与常规算术没有什么不同。解决您遇到的此类问题的关键是要意识到您通常会解决该问题的方法仍然有效(在下文中,任何提及数字都意味着整数):
说你有
15 + x = 20
你解决这个问题的方法是通过意识到在常规加法下 15 的倒数是 -15 然后你可以写(像我们自然地一样利用交换性和结合性)
15 + x + (-15) = (15 + (-15)) + x = 0 + x = x = 20 + (-15) = 5
所以你的答案是 x = 5
现在谈谈你的问题。
假设 N 和 M 是已知的,并且您正在寻找模 k 加法下的 x:
( N + x ) 模 k = M
首先意识到
( N + x ) mod k = ( ( N mod k ) + ( x mod k ) ) mod k
让问题变得有意义
M mod k = M
和
x 模 k = x
所以通过让
N mod k = N_k
和
( a + b ) mod k = a +_k b
你有
N_k +_k x = M
这意味着您需要的是+_k下的N_k的倒数。这实际上非常简单,因为 +_k 下的倒数满足这个方程:
N_k +_k ("-N_k") = 0
这实际上非常简单,因为对于一个数字 y 使得 0 <= y < k
(y + (k - y)) 模 k = k 模 k = 0
以便
“-N_k” = (k-N_k)
进而
N_k +_k x +_k "-N_k" = N_k +_k "-N_k" +_k x = 0 +_k x = x = M +_k "-N_k" = M +_k (k - N_k)
使解决方案
( N + x ) 模 k = M
是
x = ( M + ( k - ( N mod k ) ) ) mod k
特别是针对您的问题
( 12345600 + x ) % 97 = 1
解决了
x = ( 1 + ( 97 - ( 12345600 模 97 ) ) 模 97 = 76
请注意,只要 k < 100,您的解决方案总是有两位数的要求是内置的