Previous: Miscellaneous Integer Functions, Up: Integer Functions [Index]
この節で述べる関数は,様々な特殊な目的のために用意されています。普通はアプリケーションで利用することはないでしょう。
この関数は廃止予定です。使用しないで下さい。
integer用のメモリ空間をnew_allocリムに変更します。intergerに入っている値はそのまま保持されますが,メモリ空間が足りないようなら0になります。返り値は無用のものなので無視しましょう。
この関数を使うよりはmpz_realloc2
関数の方がいいでしょう。 mpz_realloc2
関数もこの_mpz_realloc
関数も同じようにメモリ空間の付け替えが可能ですが,_mpz_realloc
関数の方は,リムのサイズの指定ができます。
opのn番目のリムを返します。opの符号は無視され,絶対値だけを使用します。最小有効リムは0番目です。
mpz_size
関数を使うと,opが何リムから構成されているか分かります。
nが0以上mpz_size(op)-1
リムの範囲外にある時には,mpz_getlimbn
関数はゼロを返します。
opを構成するリム数を返します。opがゼロであれば,返り値もゼロになります。
xの絶対値を構成するリム配列へのポインタを返します。配列の大きさは mpz_size(x)
で分かります。この関数は読み取りしかできません。
書き込み可能なリム配列へのポインタを返します。配列は必要に応じて,nリム分入るように再確保されます。この関数を実行する際にはn > 0でなければなりません。mpz_limbs_modify
関数はxの古い絶対値はそのまま残しつつ,再確保されたポインタを返します。mpz_limbs_write
関数の場合は古い値は破壊され,何が入っているか分からない配列へのポインタを返します。
xの内部サイズフィールドの値を書き換えます。 mpz_limbs_write
関数やmpz_limbs_modify
関数でリム配列を書き換えた後にこの関数を適用し,書き換え処理を完了します。この配列にはabs(s)分の有効リムが確保されてxの絶対値が書きこまれ,xの符号にはsの符号が格納されます。この関数はxを再確保しませんので,リムポインタはそのまま使用できます。
void foo (mpz_t x) { mp_size_t n, i; mp_limb_t *xp; n = mpz_size (x); xp = mpz_limbs_modify (x, 2*n); for (i = 0; i < n; i++) xp[n+i] = xp[n-1-i]; mpz_limbs_finish (x, mpz_sgn (x) < 0 ? - 2*n : 2*n); }
既存のリム配列とそのサイズを使用してxを初期化します。xは書き込み不可として扱わなければなりません。他のmpz関数への入力値として安全な渡し方ができるものなので,出力先としては使用しないで下さい。xpは最低でも読み込み可能なリムが一つ以上で,abs(xs)個分のものとします。返り値はxですが,定数ポインタ型にキャストして返されます。
void foo (mpz_t x) { static const mp_limb_t y[3] = { 0x1, 0x2, 0x3 }; mpz_t tmp; mpz_add (x, x, mpz_roinit_n (tmp, y, 3)); }
このマクロはmpz_t変数への代入を行う初期化関数として展開されます。リム配列xpは少なくとも読み取り可能なリムへのポインタでなければならず,mpz_roinit_n
関数とはこの点が異なります。配列は正規化,つまり,xsが非ゼロであれば,xp[abs(xs)-1]
も非ゼロでなければなりません。このマクロは定数値となりますので,非定数値に対して適用するのであればC99をサポートするCコンパイラが必要となります。
void foo (mpz_t x) { static const mp_limb_t ya[3] = { 0x1, 0x2, 0x3 }; static const mpz_t y = MPZ_ROINIT_N ((mp_limb_t *) ya, 3); mpz_add (x, x, y); }