EN JA
LIBMP(3)
LIBMP(3) FreeBSD Library Functions Manual LIBMP(3)

名称

libmp伝統的な BSD 多倍精度整数演算ライブラリ

書式

#include < mp.h>

関数プロトタイプは、テキストの本体で与えられます。

このインタフェースを使用するアプリケーションは、 -lmp (このライブラリ) および -lcrypto ( crypto(3)) とリンクしなければなりません。

解説

このインタフェースは、 crypto(3) BIGNUM ライブラリを支持してもはや時代遅れです。

libmp は、伝統的な BSD 多倍精度整数演算ライブラリです。それは、多くの問題を持っており、信頼性に関心があるどんなプログラムでも使用ことは不適当です。互換性のためにだけに提供されています。

これらのルーチンは、定義されたタイプ MINT を使用して格納された任意の精度の整数の演算を実行します。 MINT へのポインタは、 mp_itom() または mp_xtom() を使用して初期化され、それらがもう必要でないときは、 mp_mfree() で再利用されなければなりません。それらの引数の 1 つに結果を格納するルーチンは、また、後者は、それが渡される前に初期化されていた予想します。次のルーチンが定義されて実装されています:

MINT *mp_itom( short n);

MINT *mp_xtom( const char *s);

char *mp_mtox( const MINT *mp);

void mp_mfree( MINT *mp);

mp_itom() は、 n の値がある MINT を返します。 mp_xtom() は、16 進で扱われる s の値がある MINT を返します。 mp_itom() と mp_xtom() からの返り値は、それらがもう必要でないときに、 mp_mfree() で解放しなければなりません。 mp_mtox() は、 mp の値を持っているヌル文字で終了する 16 進文字列を返します。返された値は、それがもう必要でないときに、 free() ( free(3)) で解放しなければなりません。訳注: free() は、 mfree() の誤りか?

void mp_madd( const MINT *mp1, const MINT *mp2, MINT *rmp);

void mp_msub( const MINT *mp1, const MINT *mp2, MINT *rmp);

void mp_mult( const MINT *mp1, const MINT *mp2, MINT *rmp);

mp_madd(), mp_msub(), と mp_mult() は、それぞれ rmp 中の mp1mp2 の和、差または積を格納します。

void mp_mdiv( const MINT *nmp, const MINT *dmp, MINT *qmp, MINT *rmp);

void mp_sdiv( const MINT *nmp, short d, MINT *qmp, short *ro);

mp_mdiv() は、それぞれ nmpdmp の商と剰余を計算して、 qmprmp に結果を格納します。除数 ( dmpd) と剰余 ( rmpro) が普通の整数であること除いて、 mp_sdiv() は、 mp_mdiv() と同様です。

void mp_pow( const MINT *bmp, const MINT *emp, const MINT *mmp, MINT *rmp);

void mp_rpow( const MINT *bmp, short e, MINT *rmp);

mp_rpow() は、 bmpemp 乗を計算し、 mmp を法として通分します。結果は、 rmp に格納されます。 mp_pow() は、 bmpe 乗を計算し、結果を rmp に格納します。

void mp_min( MINT *mp);

void mp_mout( const MINT *mp);

mp_min() は、標準の入力から 1 行読み込み、10 進数としてそれを解釈することを試み、成功すれば、結果を mp 格納します。 mp_mout() は、標準出力に (後続する改行なしに) mp を 10 進数の値で印刷 (表示) します。

void mp_gcd( const MINT *mp1, const MINT *mp2, MINT *rmp);

mp_gcd() は、 mp1mp2 の最大公約数を計算して、結果を rmp に格納します。

int mp_mcmp( const MINT *mp1, const MINT *mp2);

mcmp は、 mp1mp2 の値を比較して、2 つの値が等しいなら 0 を、 mp1mp2 より大きいなら 0 より大きい値を、返します、0 mp2mp1 より大きいなら 0 未満の値を返します。

void mp_move( const MINT *smp, MINT *tmp);

mp_move() は、 smp の値を tmp にコピーします (両方の値は、初期化されていなければなりません)。

void mp_msqrt( const MINT *nmp, MINT *xmp, MINT *rmp);

mp_msqrt() は、 nmp の平方根と剰余を計算して、それぞれそれらを xmprmp に格納します。

実装に関する注

libmp のこのバージョンは、 crypto(3) BIGNUM ライブラリで実装されています。

診断

メモリを使い果たすか、不正な操作は、エラーメッセージを標準エラーに出力し、 abort(3) が呼び出されます。

歴史

libmp ライブラリは、 4.3BSD で登場しました。 libmp といっしょに出荷された FreeBSD 2.2 は、 libgmp という名前で実装しました。この実装は、 FreeBSD 5.0 で登場しました。

バグ

エラーは、返り値の代わりに標準エラーへの出力と異常なプログラム終了で報告されます。アプリケーションは、この振る舞いを制御することができません。

mp_mtox() によって返された文字列が呼び出し側によって書き込まれたかどうかは明確ではありません。この実装は、それを許可しますが、他のものは許可しないかもしれません。理想的には、 mp_mtox() は、書き込まれたバッファへのポインタを取ります。

1 つの呼び出しでソース (元) と送り先の両方に同じ変数を使用することが許されるかどうかは明確ではありません。この実装で呼び出しのいくつかはこれを許しますが、他のものは許しません。

September 7, 1989 FreeBSD