Next: , Previous: , Up: Integer Functions   [Index]


5.6 除算関数

割る数がゼロの時の商は定義されていません。除算関数や剰余関数(剰余べき乗関数mpz_powmmpz_powm_uiも含む)にゼロ除算がセットされると,通常のCの整数演算と同様に,算術例外が発生します。

Function: void mpz_cdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
Function: void mpz_cdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
Function: void mpz_cdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
Function: unsigned long int mpz_cdiv_q_ui (mpz_t q, const mpz_t n, unsigned long int d)
Function: unsigned long int mpz_cdiv_r_ui (mpz_t r, const mpz_t n, unsigned long int d)
Function: unsigned long int mpz_cdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long int d)
Function: unsigned long int mpz_cdiv_ui (const mpz_t n, unsigned long int d)
Function: void mpz_cdiv_q_2exp (mpz_t q, const mpz_t n, mp_bitcnt_t b)
Function: void mpz_cdiv_r_2exp (mpz_t r, const mpz_t n, mp_bitcnt_t b)
Function: void mpz_fdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
Function: void mpz_fdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
Function: void mpz_fdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
Function: unsigned long int mpz_fdiv_q_ui (mpz_t q, const mpz_t n, unsigned long int d)
Function: unsigned long int mpz_fdiv_r_ui (mpz_t r, const mpz_t n, unsigned long int d)
Function: unsigned long int mpz_fdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long int d)
Function: unsigned long int mpz_fdiv_ui (const mpz_t n, unsigned long int d)
Function: void mpz_fdiv_q_2exp (mpz_t q, const mpz_t n, mp_bitcnt_t b)
Function: void mpz_fdiv_r_2exp (mpz_t r, const mpz_t n, mp_bitcnt_t b)
Function: void mpz_tdiv_q (mpz_t q, const mpz_t n, const mpz_t d)
Function: void mpz_tdiv_r (mpz_t r, const mpz_t n, const mpz_t d)
Function: void mpz_tdiv_qr (mpz_t q, mpz_t r, const mpz_t n, const mpz_t d)
Function: unsigned long int mpz_tdiv_q_ui (mpz_t q, const mpz_t n, unsigned long int d)
Function: unsigned long int mpz_tdiv_r_ui (mpz_t r, const mpz_t n, unsigned long int d)
Function: unsigned long int mpz_tdiv_qr_ui (mpz_t q, mpz_t r, const mpz_t n, unsigned long int d)
Function: unsigned long int mpz_tdiv_ui (const mpz_t n, unsigned long int d)
Function: void mpz_tdiv_q_2exp (mpz_t q, const mpz_t n, mp_bitcnt_t b)
Function: void mpz_tdiv_r_2exp (mpz_t r, const mpz_t n, mp_bitcnt_t b)

ndで割り,qに商を,rに剰余を格納します。2exp付きの関数は, d=2^bで除算を行います。丸めの方法は下記の通り3種類あり, 使用アプリケーションごとに使い分けができます。

上記の除算関数は必ず,qrn=q*d+r を,r0<=abs(r)<abs(d)を満足するように値を決めます。

q除算関数は商のみ,r除算関数は剰余のみ,qr関数は商と剰余の両方を計算します。 qr関数では,qrに同じ変数を指定することはできません。

ui除算関数は返り値が剰余となります。従って,これらの関数はdiv_ui除算関数と同じ返り値となります。 tdivcdiv関数については,剰余がマイナスになることもありますが,その場合は剰余の絶対値を返り値とします。

2exp除算関数は,割る数(除数)が2^bとなりますので,実際の計算は右シフトとビットマスクで行います。 丸め方は他の除算関数と同じです。

正のnに対しては,mpz_fdiv_q_2exp関数もmpz_tdiv_q_2exp関数も,同じビット単位の 右シフトだけを実行します。負のnの場合,mpz_fdiv_q_2exp関数はビット演算関数と同様にnを 2の補数として扱って効率的に右シフトを行い,mpz_tdiv_q_2exp関数はnを符号と絶対値だけのものとして 扱います。

Function: void mpz_mod (mpz_t r, const mpz_t n, const mpz_t d)
Function: unsigned long int mpz_mod_ui (mpz_t r, const mpz_t n, unsigned long int d)

n mod dを求め,rにセットします。割る数の符号は無視されますので,結果は必ず非負整数となります。

mpz_mod_ui関数は,上記のmpz_fdiv_r_ui関数と同一のもので,rに剰余がセットされます。返り値が必要な場合は mpz_fdiv_ui関数を使ってみて下さい。

Function: void mpz_divexact (mpz_t q, const mpz_t n, const mpz_t d)
Function: void mpz_divexact_ui (mpz_t q, const mpz_t n, unsigned long d)

n/dの値をqに格納します。ndで割り切れる場合にのみ,正しい商を返します。

これらの関数は,他の除算関数よりかなり高速なので,正確な除算が可能であると分かっている場合,例えば有理数を小さい値で約分するケースには最適です。

Function: int mpz_divisible_p (const mpz_t n, const mpz_t d)
Function: int mpz_divisible_ui_p (const mpz_t n, unsigned long int d)
Function: int mpz_divisible_2exp_p (const mpz_t n, mp_bitcnt_t b)

nが正確にdで割り切れる場合は非ゼロを返します。mpz_divisible_2exp_p関数は2^b で割り切れるかどうかで判断します。

n = q*dを満足する整数dが存在していれば,ndで割り切れることになります。 他の除算関数とは違い,d=0でも実行でき,この場合はゼロだけがゼロで割り切れるものとして扱います。

Function: int mpz_congruent_p (const mpz_t n, const mpz_t c, const mpz_t d)
Function: int mpz_congruent_ui_p (const mpz_t n, unsigned long int c, unsigned long int d)
Function: int mpz_congruent_2exp_p (const mpz_t n, const mpz_t c, mp_bitcnt_t b)

nc mod dに対して合同であれば非ゼロを返します。mpz_congruent_2exp_pdの代わりにmod 2^bで 判断します。

n = c + q*dを満足する整数qが存在していれば, nc mod dに対して合同であると言えます。他の除算関数とは異なり,d=0 であっても実行でき,この場合はncが同一の値である時のみ,mod 0に対して合同であると判断します。


Next: , Previous: , Up: Integer Functions   [Index]