Python - べき剰余アルゴリズムの実装!

Updated:


こんにちは。

以前、 C++ や Ruby で「べき剰余」のアルゴリズムを実装しました。

今回は Python で実装してみました。

0. 前提条件

  • LMDE 2 (Linux Mint Debian Edition 2; 64bit) での作業を想定。
  • Python 3.6.4 での作業を想定。
  • 当方は他のバージョンとの共存環境であり、 python3.6, pip3.6 で 3.6 系を使用するようにしている。(適宜、置き換えて考えること)

1. べき剰余、べき剰余演算アルゴリズムについて

当ブログ過去記事を参照。

2. Python スクリプトの作成

まず、非再帰的な記述方法で作成。

File: modular_exponentiation_1.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#! /usr/local/bin/python3.6
"""
Modular Exponentiation (iterative)
"""
import sys
import traceback


class ModularExponentiation:
    def comp_mod_exp(self, b, e, m):
        """ Computation of modular exponentiation

        :param  int  b: base
        :param  int  e: exponent
        :param  int  m: modulus
        :return int me: modular expornentiation
        """
        ans = 1
        try:
            while e > 0:
                if (e & 1) == 1:
                    ans = (ans * b) % m
                e >>= 1
                b = (b * b) % m
            return ans
        except Exception as e:
            raise


if __name__ == '__main__':
    # me = b^e mod m
    b, e, m = 12345, 6789, 4567
    try:
        obj = ModularExponentiation()
        me = obj.comp_mod_exp(b, e, m)
        print("{}^{} mod {} = {}".format(b, e, m, me))
    except Exception as e:
        traceback.print_exc()
        sys.exit(1)

次に、再帰的な記述方法で作成。(comp_mod_exp メソッドの内容が異なるだけ)

File: modular_exponentiation_2.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#! /usr/local/bin/python3.6
"""
Modular Exponentiation (recursive)
"""
import sys
import traceback


class ModularExponentiation:
    def comp_mod_exp(self, b, e, m):
        """ Computation of modular exponentiation

        :param  int  b: base
        :param  int  e: exponent
        :param  int  m: modulus
        :return int me: modular expornentiation
        """
        try:
            if e == 0:
                return 1
            ans = self.comp_mod_exp(b, e // 2, m)
            ans = (ans * ans) % m
            if e % 2 == 1:
                ans = (ans * b) % m
            return ans
        except Exception as e:
            raise


if __name__ == '__main__':
    # me = b^e mod m
    b, e, m = 12345, 6789, 4567
    try:
        obj = ModularExponentiation()
        me = obj.comp_mod_exp(b, e, m)
        print("{}^{} mod {} = {}".format(b, e, m, me))
    except Exception as e:
        traceback.print_exc()
        sys.exit(1)

3. 動作確認

$ ./modular_exponentiation_1.py
12345^6789 mod 4567 = 62

$ ./modular_exponentiation_2.py
12345^6789 mod 4567 = 62

6. 参考サイト


以上。





 

Sponsored Link

 

Comments