多倍長演算ライブラリ

RubyはBignumがあってIntegerクラスと勝手に変換してくれるのが便利だなと思っていたけど、多倍長演算(arbitrary precision arithmetic)のライブラリというのは結構ゴロゴロと存在していて、使うのも難しくないらしいことを発見した。きっとJavaにもいいライブラリがあるんだろうなぁ。

例えばGNUの「GMP」は、Mac OS Xだと、以下のようにコンパイルして実行できる。MacPortsでインストールできるようだけど、ぼくの環境にはすでに入っていた。何かの依存関係で入っていたらしい。

#include <stdio.h>
#include <gmp.h>
#define BASE 10

int main(void) {

  mpz_t a, b, r;
  char num1[256], num2[256];

  printf("numbers to multiply? :");
  scanf("%s%s", num1, num2);

  mpz_init(r);
  mpz_init_set_str(a, num1, BASE);
  mpz_init_set_str(b, num2, BASE);
  //  mpz_add(r, a, b);
  mpz_mul(r, a, b);
  
  mpz_out_str (stdout, BASE, r); 
  printf("\n");
  mpz_clear(a);
  mpz_clear(b);
  mpz_clear(r);
  return 0;
}
% gcc -I/opt/local/include -L/opt/local/lib -lgmp test1.c
% ./a.out
numbers to multiply? :123456789 11111111111111111111111111111111111111111111
1371742099999999999999999999999999999999999986282579
%

結局のところ、Rubyの価値は、こうしたライブラリのAPIみたいなのを覚えたり、型の変換を意識したりせずに、低い学習コスト、準備コストで色んなことができるってことなのかな。