Previous: , Up: Integer Functions   [Index]


5.16 特殊目的の関数

この節で述べる関数は,様々な特殊な目的のために用意されています。普通はアプリケーションで利用することはないでしょう。

Function: void mpz_array_init (mpz_t integer_array, mp_size_t array_size, mp_size_t fixed_num_bits)

この関数は廃止予定です。使用しないで下さい。

Function: void * _mpz_realloc (mpz_t integer, mp_size_t new_alloc)

integer用のメモリ空間をnew_allocリムに変更します。intergerに入っている値はそのまま保持されますが,メモリ空間が足りないようなら0になります。返り値は無用のものなので無視しましょう。

この関数を使うよりはmpz_realloc2関数の方がいいでしょう。 mpz_realloc2関数もこの_mpz_realloc関数も同じようにメモリ空間の付け替えが可能ですが,_mpz_realloc関数の方は,リムのサイズの指定ができます。

Function: mp_limb_t mpz_getlimbn (const mpz_t op, mp_size_t n)

opn番目のリムを返します。opの符号は無視され,絶対値だけを使用します。最小有効リムは0番目です。

mpz_size関数を使うと,opが何リムから構成されているか分かります。 nが0以上mpz_size(op)-1リムの範囲外にある時には,mpz_getlimbn関数はゼロを返します。

Function: size_t mpz_size (const mpz_t op)

opを構成するリム数を返します。opがゼロであれば,返り値もゼロになります。

Function: const mp_limb_t * mpz_limbs_read (const mpz_t x)

xの絶対値を構成するリム配列へのポインタを返します。配列の大きさは mpz_size(x)で分かります。この関数は読み取りしかできません。

Function: mp_limb_t * mpz_limbs_write (mpz_t x, mp_size_t n)
Function: mp_limb_t * mpz_limbs_modify (mpz_t x, mp_size_t n)

書き込み可能なリム配列へのポインタを返します。配列は必要に応じて,nリム分入るように再確保されます。この関数を実行する際にはn > 0でなければなりません。mpz_limbs_modify関数はxの古い絶対値はそのまま残しつつ,再確保されたポインタを返します。mpz_limbs_write関数の場合は古い値は破壊され,何が入っているか分からない配列へのポインタを返します。

Function: void mpz_limbs_finish (mpz_t x, mp_size_t s)

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);
}
Function: mpz_srcptr mpz_roinit_n (mpz_t x, const mp_limb_t *xp, mp_size_t xs)

既存のリム配列とそのサイズを使用して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 MPZ_ROINIT_N (mp_limb_t *xp, mp_size_t xs)

このマクロは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);
}