2017-10-11 18 views
1

Affine cipherを復号化するコードを書こうとしています。^( - 1)*(x-b)mod mのx <bの場合はどうなりますか?

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

問題は次のとおりです:

今、私は、復号化機能があることがわかっxbよりも小さいときに答えは否定的です。

私は、それはコードの質問ではなく、数学の質問であることを知っていますが、私は助けてくれる素敵な人がいることを願っています。

+0

:(-x)mod nを==(N - (のx%のN))%N –

+0

私はそれを得ることはありません... –

答えて

1

実際には、数学とプログラミングにまたがる質問です。

まず、数学者とプログラマは「mod」を多少使い分けます。

数学者は、書いた方程式についての声明としてそれを使用します。彼らが "a = b + c mod m"と言っているのは、モジュロm算術では "a = b + c"であるということです。

プログラマーは、整数除算の後に剰余を与える演算子としてmodを使用します。

第2に、整数除算「floored division」、「truncated division」および「euclidian division」を定義する複数の方法があり、モジュロ演算子を定義する複数の方法があります。

は、残念ながら、あなたのアルゴリズムのために必要なもの「床の分割後の余り」ですが、どのようなプログラミング言語があなたを与えていることは切り捨て分割後の「余りある。

一つの可能​​な修正プログラムは、単にif文を追加することです。あなたは、このIDを使用することができます

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

はありがとう、あなたは私の問題 –

+0

を解決したり! '((x mod n)+ n)mod n'を使うと、'((x-b)mod 26 + 26)mod 26'を使って 'if'文を取り除くことができます。一般的に動作する方法。 –

+0

コンパイラが最適化しないと仮定すると、分岐が保存されますが、2番目のmod演算が追加されます。それがより確実かどうかは、CPUターゲットに依存します。 – plugwash

関連する問題