Next: Integer Exponentiation, Previous: Integer Arithmetic, Up: Integer Functions [Index]
割る数がゼロの時の商は定義されていません。除算関数や剰余関数(剰余べき乗関数mpz_powm
やmpz_powm_ui
も含む)にゼロ除算がセットされると,通常のCの整数演算と同様に,算術例外が発生します。
nをdで割り,qに商を,rに剰余を格納します。2exp
付きの関数は,
d=2^bで除算を行います。丸めの方法は下記の通り3種類あり,
使用アプリケーションごとに使い分けができます。
cdiv
除算関数はqを+infinity方向に丸め,rはdとは逆符号の値にします。
c
は“ceil”(天井関数)を意味します。
fdiv
除算関数は,qを-infinity方向に丸め,rはdと同符号の値にします。
f
は“floor”(床関数)を意味します。
tdiv
除算関数は,qをゼロ方向に切り捨て,rはnと同符号の値にします。
t
は“truncate”(切り捨て)を意味します。
上記の除算関数は必ず,qとrはn=q*d+r を,rは0<=abs(r)<abs(d)を満足するように値を決めます。
q
除算関数は商のみ,r
除算関数は剰余のみ,qr
関数は商と剰余の両方を計算します。
qr
関数では,qとrに同じ変数を指定することはできません。
ui
除算関数は返り値が剰余となります。従って,これらの関数はdiv_ui
除算関数と同じ返り値となります。
tdiv
とcdiv
関数については,剰余がマイナスになることもありますが,その場合は剰余の絶対値を返り値とします。
2exp
除算関数は,割る数(除数)が2^bとなりますので,実際の計算は右シフトとビットマスクで行います。
丸め方は他の除算関数と同じです。
正のnに対しては,mpz_fdiv_q_2exp
関数もmpz_tdiv_q_2exp
関数も,同じビット単位の
右シフトだけを実行します。負のnの場合,mpz_fdiv_q_2exp
関数はビット演算関数と同様にnを
2の補数として扱って効率的に右シフトを行い,mpz_tdiv_q_2exp
関数はnを符号と絶対値だけのものとして
扱います。
n mod
dを求め,rにセットします。割る数の符号は無視されますので,結果は必ず非負整数となります。
mpz_mod_ui
関数は,上記のmpz_fdiv_r_ui
関数と同一のもので,rに剰余がセットされます。返り値が必要な場合は
mpz_fdiv_ui
関数を使ってみて下さい。
n/dの値をqに格納します。nがdで割り切れる場合にのみ,正しい商を返します。
これらの関数は,他の除算関数よりかなり高速なので,正確な除算が可能であると分かっている場合,例えば有理数を小さい値で約分するケースには最適です。
nが正確にdで割り切れる場合は非ゼロを返します。mpz_divisible_2exp_p
関数は2^b
で割り切れるかどうかで判断します。
n = q*dを満足する整数dが存在していれば,nはdで割り切れることになります。 他の除算関数とは違い,d=0でも実行でき,この場合はゼロだけがゼロで割り切れるものとして扱います。
nが c mod dに対して合同であれば非ゼロを返します。mpz_congruent_2exp_p
はdの代わりにmod 2^bで
判断します。
n = c + q*dを満足する整数qが存在していれば, nはc mod dに対して合同であると言えます。他の除算関数とは異なり,d=0 であっても実行でき,この場合はnとcが同一の値である時のみ,mod 0に対して合同であると判断します。
Next: Integer Exponentiation, Previous: Integer Arithmetic, Up: Integer Functions [Index]