爆死したCBCTF2017の供養も兼ねて、sbclのcontribにあったMPFRの使い方をメモ。
Common modulus2で3乗根の計算をすればいいことまでは分かったけど、そもそも計算の仕方が分からずに死んだ。
終わったあとに再び探しまわったら、sbclのcontribの中にMPFRのモジュールがあったので使い方を調べた。
日本語の情報がなかったのでメモしておく。
使い方
(require 'sb-mpfr)
(setf mpfr-f (sb-mpfr:coerce 27 'sb-mpfr:mpfr-float))
(sb-mpfr:coerce (sb-mpfr:k-root mpfr-f 3) 'integer) ;; => 3
こんな感じで使える。
サンプルでやってることは、27の3乗根をとって、整数に変換するというだけの処理。
要点は、最初にsb-mpfr
をインポートしないといけないということと、数値をsb-mpfr
モジュール中のcoerce
でmpfr-float
に変換する必要があることである。
他にも精度を任意に変えられたりするので、多倍長整数の演算をするときにも精度を保ちつつ計算できる。
lisp組み込みの関数だと時々変換できなくて計算できなかったりするので非常に助かる。