Chapter Fourteen

第14話



前回まで作ってきたのは、RSA方式の原理と実現方法を検討するためのプロトタイプの暗号VIだった。今回からは実用性に挑戦して拡張を試みることにしよう。本格的な暗号VIを考えたとき、LabVIEWで標準的に四則演算ができる整数の上限がU32であることが制約となる。実行速度も問題になるだろう。遊びの強みで、どこまで行けるか分からないが、行けるところまで行ってみようと思う。

大きな整数の表現方法としてクラスターを使おうかとも考えたが、U32の配列を使うことにした。要素を操作する関数が豊富なことと、配列のサイズを変えることで数値の範囲を簡単に選べることが理由だ。配列のままでは入力するときも、出力を読みとるときも煩雑なので、文字列を使って10進数表現と16進数表現を行うことにする。

U32の配列を一まとまりの数として四則演算できるVIも必要だ。加算は繰り上げを気にするだけで良いが、減算、乗算、除算はひと工夫が必要になる。昔読んだマイクロコンピュータのハードウエアの参考書を引っぱり出して、乗算器、除算器のおさらいが必要だ。

今回は一番簡単な加算について紹介してみよう。簡単とはいえ、加算は他の演算で頻繁に使われる基本的なサブVIとなるので、動作速度は注意が必要だ。
入力、出力ともにU32の配列で、パネルでは16進表示を使用している。0番目の要素の最大ビットを数値の先頭と考える。要素内の数値は先頭が0の場合は表示されないので注意が必要だ。たとえば、U32n;A+Bの6番目の要素は02222230だが、先頭の0は表示されていない。このような16進表示の場合は先頭の0を表示するようにしたいのだが、残念ながら見つけられなかった。
AとBの配列の大きさは同じ大きさでなければならないが、使い方で注意することにしてviではノーチェックだ。

標準のU32の加算はオーバーフローしても知らんぷりするのでそのままでは具合が悪い。U32を上位16ビットと下位16ビットに分割し、それぞれU32に変換して加算することにした。加算後に10000HとANDをとって17ビット目が1になっている(桁上げ有り)かチェックする。
桁上げのために配列の要素の順番を逆にしてからForループに入れている。
ここにいたる前に2タイプ作って試している。(1)U32の最上位ビットを調べてキャリーが出るかどうか判断する方法と、(2)ハードウエアで使う論理回路をAND, OR, NOTなどで組む方法だ。
それらに比べこのダイアグラムはシンプルで動作も速く、いまのところ気に入っている。もっと速いやりかたを見つけた人は、ぜひ教えて欲しい。
See you!

Nigel Yamaguchi

戻る