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]