MathematicaとPythonで2進数表示

授業でMathematicaを使って暗号をプログラムするのがあったので
せっかくなのでその時のコードと、それをPythonで書き直したものを紹介しつつ、
暗号の勉強を軽くしてみたいなと思います。

このCryptoカテゴリーに随時投稿していきます。

 

今回はその序章の序章ということで、
そもそも暗号ですらないですが、後々使うことになる「10進数の数字を入力すると、2進数のリストで出力する」プログラムを作ります。
まぁ、こんなもの自分で実装しなくてももとからライブラリとして用意されているのですが、授業で作ったので・・・。

 

Python

 

なんか良い感じに再帰を使ってみたかったのですが、「リストで返す」という制限上むりっぽかったです。
Pythonにはdo-while文がないので、無限ループのwhile文を作り、条件が一致したらbreakするようにしました。

 

divmod(a,b)はaをbで割った時の商と剰余を返すメソッドです。
insert(a,b)はリストのa番目にbを追加するメソッドです。

 

出力

In[1]=to_bin(10)
Out[1]=[1,0,1,0]

 

ちなみに正規のライブラリを使うならbin()というのがあります。
出力の先頭に0bというのが付いた2進数が返されます。

In[1]=bin(10)
Out[1]=’0b1010′

【参考】Pythonで2進数、8進数、16進数の数値・文字列を扱う | Python / note.nkmk.me

 

Mathematica

 

言語の仕様上かPythonと同じように実装するとエラーが起きたので、以下のような感じになりました。
QutientRemainder(a,b)はpythonのdivmodと同じですね。

 

(* 2進数表示 *)
Bin[m_] := Module[{b, q, r},
  (* 自然数mに対し、その2進数表示を求める *)
  (* :pram m: <int> 整数; *)
  (* :return: <int> mの2進数表示; *)
  b = {};
  {q, r} = QuotientRemainder[m, 2];
  PrependTo[b, r];
  While[q != 0,
    {q, r} = QuotientRemainder[q, 2];
    PrependTo[b, r];
  ];
  Return[b];
];

出力

In[1]=Bin[10]
Out[1]={1,0,1,0}

 

正規のライブラリを使うならIntegerDigits[n,b]というのがあり、
nのb進数をリストで返却します。

【参考】IntegerDigits—Wolfram言語ドキュメント

コメントを残す