如果在^( - 1)*(x-b)模m中x

问题描述:

我试图编写一个解密任何Affine cipher的代码。现在如果在^( - 1)*(x-b)模m中x <b,那么该怎么办?

,我发现解密功能是:

y = a^(-1) * (x-b) mod 26

的问题是:当xb较小的答案是否定的。

我知道这是一个数学问题,而不是一个代码问题,但我希望有一些可以帮助我的好人。

+0

你可以用这个身份!(-x)模N ==(N - (X%N))%N –

+0

我不明白这一点.. –

这实际上是一个跨越数学和编程的问题。

首先,数学家和程序员使用“mod”有些不同。

数学家用它作为他们刚写的等式的陈述。当他们说“a = b + c mod m”时,他们的意思是模m算术中的“a = b + c”。

另一方面,程序员使用mod作为运算符,在整数除法后提供余数。其次,定义整数除法“地板分割”,“截断分割”和“欧几里德分割”有多种方式,因此定义了模算子的多种方式。

不幸的是,你需要什么你的算法是,但“后地板的余数”你的编程语言是给你的是后截断除法“剩。

一个可能的解决方法是,如果语句只需添加一个。

if (y < 0) y += 26 
+0

谢谢你解决了我的问题 –

+0

或'((x-b)mod 26 + 26)mod 26'去掉if语句。还有其他一些选项,但是用((x mod n)+ n)mod n'是一般应该工作的方法。 –

+0

假设编译器没有优化它,这将保存一个分支,但会添加第二个mod操作。这是否更好可能取决于CPU目标。 – plugwash