mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-05-02 01:33:44 +02:00
7849 lines
154 KiB
PHP
7849 lines
154 KiB
PHP
{$ifopt c-}
|
|
{$error 'Must enable assertions'}
|
|
{$endif}
|
|
|
|
const
|
|
BASE10 = 10;
|
|
BASE16 = 16;
|
|
Z_FMT = '%Zd';
|
|
Q_FMT = '%Qd';
|
|
|
|
function alloc_func(alloc_size: sizeuint): pointer; cdecl;
|
|
begin
|
|
result := getmem(alloc_size);
|
|
end;
|
|
|
|
procedure free_proc(p: pointer; size: sizeuint); cdecl;
|
|
begin
|
|
assert(size = size); // hint off
|
|
freemem(p);
|
|
end;
|
|
|
|
function reallocate_func(p: pointer; old_size, new_size: sizeuint): pointer; cdecl;
|
|
begin
|
|
assert(old_size = old_size); // hint off
|
|
result := reallocmem(p, new_size);
|
|
end;
|
|
|
|
function rnd_test(var state: randstate_t): boolean;
|
|
const N = 1000000;
|
|
var r1, r2, r3: valuint;
|
|
begin
|
|
r1 := mp_urandomm_ui(state, N);
|
|
r2 := mp_urandomm_ui(state, N);
|
|
r3 := mp_urandomm_ui(state, N);
|
|
result := (r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3));
|
|
end;
|
|
|
|
{ TTestGmpBinding }
|
|
|
|
procedure TTestGmpBinding.mp_set_memory_functions_test;
|
|
var
|
|
af0, af: alloc_func_t;
|
|
rf0, rf: reallocate_func_t;
|
|
fp0, fp: free_proc_t;
|
|
begin
|
|
mp_get_memory_functions(@af0, @rf0, @fp0);
|
|
try
|
|
mp_set_memory_functions(@alloc_func, @reallocate_func, @free_proc);
|
|
mp_get_memory_functions(@af, @rf, @fp);
|
|
assert(af = @alloc_func);
|
|
assert(rf = @reallocate_func);
|
|
assert(fp = @free_proc);
|
|
finally
|
|
mp_set_memory_functions(af0, rf0, fp0);
|
|
mp_get_memory_functions(@af, @rf, @fp);
|
|
assert(af = af0);
|
|
assert(rf = rf0);
|
|
assert(fp = fp0);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_get_memory_functions_test;
|
|
var
|
|
af: alloc_func_t;
|
|
fp: free_proc_t;
|
|
rf: reallocate_func_t;
|
|
begin
|
|
af := nil;
|
|
fp := nil;
|
|
rf := nil;
|
|
mp_get_memory_functions(nil, nil, nil);
|
|
assert(af = nil);
|
|
assert(fp = nil);
|
|
assert(rf = nil);
|
|
|
|
mp_get_memory_functions(@af, nil, nil);
|
|
assert(af <> nil);
|
|
assert(fp = nil);
|
|
assert(rf = nil);
|
|
|
|
af := nil;
|
|
mp_get_memory_functions(nil, @rf, nil);
|
|
assert(af = nil);
|
|
assert(fp = nil);
|
|
assert(rf <> nil);
|
|
|
|
rf := nil;
|
|
mp_get_memory_functions(nil, nil, @fp);
|
|
assert(af = nil);
|
|
assert(fp <> nil);
|
|
assert(rf = nil);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_randinit_default_test;
|
|
var state: randstate_t;
|
|
begin
|
|
mp_randinit_default(state);
|
|
assert(rnd_test(state));
|
|
mp_randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_randinit_mt_test;
|
|
var state: randstate_t;
|
|
begin
|
|
mp_randinit_mt(state);
|
|
assert(rnd_test(state));
|
|
mp_randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_randinit_lc_2exp_test;
|
|
const
|
|
A_ = 3;
|
|
C = 5;
|
|
M2EXP = 8;
|
|
var
|
|
state: randstate_t;
|
|
a: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(a, A_);
|
|
mp_randinit_lc_2exp(state, a, C, M2EXP);
|
|
assert(rnd_test(state));
|
|
mp_randclear(state);
|
|
mpz_clear(a);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_randinit_lc_2exp_size_test;
|
|
var state: randstate_t;
|
|
begin
|
|
assert(longbool(mp_randinit_lc_2exp_size(state, 0)));
|
|
assert(rnd_test(state));
|
|
mp_randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_randinit_set_test;
|
|
var rop, op: randstate_t;
|
|
begin
|
|
mp_randinit_default(op);
|
|
mp_randinit_set(rop, op);
|
|
assert(rnd_test(rop));
|
|
mp_randclear(rop);
|
|
mp_randclear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_randclear_test;
|
|
var state: randstate_t;
|
|
begin
|
|
mp_randinit_default(state);
|
|
mp_randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_randseed_test;
|
|
var
|
|
state: randstate_t;
|
|
seed: mpz_t;
|
|
begin
|
|
mp_randinit_default(state);
|
|
mpz_init_set_ui(seed, 0);
|
|
mp_randseed(state, seed);
|
|
mp_randclear(state);
|
|
mpz_clear(seed);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_randseed_ui_test;
|
|
var state: randstate_t;
|
|
begin
|
|
mp_randinit_default(state);
|
|
mp_randseed_ui(state, 0);
|
|
mp_randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_urandomb_ui_test;
|
|
const
|
|
B = 8 * (sizeof(valuint) - 1);
|
|
N = 1 shl B;
|
|
var
|
|
state: randstate_t;
|
|
r1, r2, r3: valuint;
|
|
begin
|
|
mp_randinit_default(state);
|
|
r1 := mp_urandomb_ui(state, B);
|
|
r2 := mp_urandomb_ui(state, B);
|
|
r3 := mp_urandomb_ui(state, B);
|
|
assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
|
|
mp_randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_urandomm_ui_test;
|
|
const N = high(valuint);
|
|
var
|
|
state: randstate_t;
|
|
r1, r2, r3: valuint;
|
|
begin
|
|
mp_randinit_default(state);
|
|
r1 := mp_urandomm_ui(state, N);
|
|
r2 := mp_urandomm_ui(state, N);
|
|
r3 := mp_urandomm_ui(state, N);
|
|
assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
|
|
mp_randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_asprintf_test;
|
|
const
|
|
N = 123456;
|
|
S = '123456';
|
|
var
|
|
z: mpz_t;
|
|
p: pchar;
|
|
begin
|
|
mpz_init_set_ui(z, N);
|
|
assert(mp_asprintf(p, Z_FMT, [@z]) = length(S));
|
|
assert(p = S);
|
|
freemem(p);
|
|
mpz_clear(z);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_asprintf_test2;
|
|
const
|
|
N = 123456;
|
|
S = '123456';
|
|
var
|
|
z: mpz_t;
|
|
p: pchar;
|
|
begin
|
|
mpz_init_set_ui(z, N);
|
|
assert(mp_asprintf(p, Z_FMT, @z) = length(S));
|
|
assert(p = S);
|
|
freemem(p);
|
|
mpz_clear(z);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_snprintf_test;
|
|
const
|
|
N = 123456;
|
|
S = '123456';
|
|
var
|
|
z: mpz_t;
|
|
buf: pchar;
|
|
begin
|
|
mpz_init_set_ui(z, N);
|
|
getmem(buf, length(S) + 1);
|
|
assert(mp_snprintf(buf, length(S) + 1, Z_FMT, [@z]) = length(S));
|
|
assert(buf = S);
|
|
freemem(buf);
|
|
mpz_clear(z);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_snprintf_test2;
|
|
const
|
|
N = 123456;
|
|
S = '123456';
|
|
var
|
|
z: mpz_t;
|
|
buf: pchar;
|
|
begin
|
|
mpz_init_set_ui(z, N);
|
|
getmem(buf, length(S) + 1);
|
|
assert(mp_snprintf(buf, length(S) + 1, Z_FMT, @z) = length(S));
|
|
assert(buf = S);
|
|
freemem(buf);
|
|
mpz_clear(z);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_sprintf_test;
|
|
const
|
|
N = 123456;
|
|
S = '123456';
|
|
var
|
|
z: mpz_t;
|
|
buf: pchar;
|
|
begin
|
|
mpz_init_set_ui(z, N);
|
|
getmem(buf, length(S) + 1);
|
|
assert(mp_sprintf(buf, Z_FMT, [@z]) = length(S));
|
|
assert(buf = S);
|
|
freemem(buf);
|
|
mpz_clear(z);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_sprintf_test2;
|
|
const
|
|
N = 123456;
|
|
S = '123456';
|
|
var
|
|
z: mpz_t;
|
|
buf: pchar;
|
|
begin
|
|
mpz_init_set_ui(z, N);
|
|
getmem(buf, length(S) + 1);
|
|
assert(mp_sprintf(buf, Z_FMT, @z) = length(S));
|
|
assert(buf = S);
|
|
freemem(buf);
|
|
mpz_clear(z);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_sscanf_test;
|
|
const
|
|
N = 3;
|
|
D = 2;
|
|
var q: mpq_t;
|
|
begin
|
|
mpq_init(q);
|
|
assert(mp_sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, [@q]) = 1);
|
|
assert(mpq_cmp_ui(q, N, D) = 0);
|
|
mpq_clear(q);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mp_sscanf_test2;
|
|
const
|
|
N = 3;
|
|
D = 2;
|
|
var q: mpq_t;
|
|
begin
|
|
mpq_init(q);
|
|
assert(mp_sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, @q) = 1);
|
|
assert(mpq_cmp_ui(q, N, D) = 0);
|
|
mpq_clear(q);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_init_test;
|
|
var integer_: mpz_t;
|
|
begin
|
|
mpz_init(integer_);
|
|
assert(mpz_get_si(integer_) = 0);
|
|
mpz_clear(integer_);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_clear_test;
|
|
const N = 1000000;
|
|
var integer_: mpz_t;
|
|
begin
|
|
mpz_init2(integer_, N);
|
|
assert(mpz_get_si(integer_) = 0);
|
|
mpz_clear(integer_);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_init2_test;
|
|
const N = 1000000;
|
|
var integer_: mpz_t;
|
|
begin
|
|
mpz_init2(integer_, N);
|
|
assert(mpz_get_si(integer_) = 0);
|
|
mpz_clear(integer_);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_init_set_si_test;
|
|
const N = -1000000;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init_set_si(rop, N);
|
|
assert(mpz_get_si(rop) = N);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_init_set_ui_test;
|
|
const N = 1000000;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(rop, N);
|
|
assert(mpz_get_ui(rop) = N);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_init_set_d_test;
|
|
const N = -1000000;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init_set_d(rop, N);
|
|
assert(mpz_get_si(rop) = N);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_init_set_test;
|
|
const N = -1000000;
|
|
var rop, op: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op, N);
|
|
mpz_init_set(rop, op);
|
|
assert(mpz_get_si(rop) = N);
|
|
mpz_clear(rop);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_init_set_str_test;
|
|
const N = 1000000;
|
|
var rop: mpz_t;
|
|
begin
|
|
assert(mpz_init_set_str(rop, pchar(inttostr(N)), BASE10) = 0);
|
|
assert(mpz_get_si(rop) = N);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_realloc_test;
|
|
const N = 1000;
|
|
var integer_: mpz_t;
|
|
begin
|
|
mpz_init(integer_);
|
|
mpz_realloc(integer_, N);
|
|
mpz_clear(integer_)
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_realloc2_test;
|
|
const N = 1000;
|
|
var integer_: mpz_t;
|
|
begin
|
|
mpz_init(integer_);
|
|
mpz_realloc2(integer_, N);
|
|
mpz_clear(integer_)
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_getlimbn_test;
|
|
const N = 1234;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(op, N);
|
|
assert(mpz_getlimbn(op, 0) = N);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_export_test;
|
|
type t = word;
|
|
const
|
|
N = 1000000;
|
|
BUF_HIGH = sizeof(N) div sizeof(t);
|
|
var
|
|
export_op, import_op: mpz_t;
|
|
buf: array[0..BUF_HIGH] of t;
|
|
count: sizeuint;
|
|
begin
|
|
mpz_init_set_si(export_op, N);
|
|
mpz_init(import_op);
|
|
mpz_export(buf, count, -1, sizeof(t), 0, 0, export_op);
|
|
mpz_import(import_op, count, -1, sizeof(t), 0, 0, buf);
|
|
assert(mpz_get_si(export_op) =mpz_get_si(import_op));
|
|
mpz_clear(export_op);
|
|
mpz_clear(import_op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_import_test;
|
|
type t = word;
|
|
const
|
|
N = 1000000;
|
|
BUF_HIGH = sizeof(N) div sizeof(t);
|
|
var
|
|
export_op, import_op: mpz_t;
|
|
buf: array[0..BUF_HIGH] of t;
|
|
count: sizeuint;
|
|
begin
|
|
mpz_init_set_si(export_op, N);
|
|
mpz_init(import_op);
|
|
mpz_export(buf, count, -1, sizeof(t), 0, 0, export_op);
|
|
mpz_import(import_op, count, -1, sizeof(t), 0, 0, buf);
|
|
assert(mpz_get_si(export_op) =mpz_get_si(import_op));
|
|
mpz_clear(export_op);
|
|
mpz_clear(import_op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_swap_test;
|
|
const
|
|
ROP_1 = -1000;
|
|
ROP_2 = 1000000;
|
|
var rop1, rop2: mpz_t;
|
|
begin
|
|
mpz_init_set_si(rop1, ROP_1);
|
|
mpz_init_set_si(rop2, ROP_2);
|
|
mpz_swap(rop1, rop2);
|
|
assert(mpz_get_si(rop1) = ROP_2);
|
|
assert(mpz_get_si(rop2) = ROP_1);
|
|
mpz_clear(rop1);
|
|
mpz_clear(rop2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_set_test;
|
|
const OP_ = 1000000;
|
|
var rop, op: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op, OP_);
|
|
mpz_set(rop, op);
|
|
assert(mpz_get_si(rop) = OP_);
|
|
mpz_clear(rop);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_set_d_test;
|
|
const OP_ = 1000000;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_set_d(rop, OP_);
|
|
assert(mpz_get_si(rop) = OP_);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_set_f_test;
|
|
const OP_ = -10;
|
|
var
|
|
op: mpf_t;
|
|
rop: mpz_t;
|
|
begin
|
|
mpf_init_set_si(op, OP_);
|
|
mpz_init(rop);
|
|
mpz_set_f(rop, op);
|
|
assert(mpz_get_si(rop) = OP_);
|
|
mpz_clear(rop);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_set_q_test;
|
|
const OP_ = -10;
|
|
var
|
|
op: mpq_t;
|
|
rop: mpz_t;
|
|
begin
|
|
mpq_init(op);
|
|
mpz_init(rop);
|
|
mpq_set_si(op, OP_, 1);
|
|
mpz_set_q(rop, op);
|
|
assert(mpz_get_si(rop) = OP_);
|
|
mpz_clear(rop);
|
|
mpq_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_set_si_test;
|
|
const OP_ = -1000000;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_set_si(rop, OP_);
|
|
assert(mpz_get_si(rop) = OP_);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_set_str_test;
|
|
const OP_ = -1000000;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
assert(mpz_set_str(rop, pchar(inttostr(OP_)), BASE10) = 0);
|
|
assert(mpz_get_si(rop) = OP_);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_set_ui_test;
|
|
const OP_ = 1000000;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_set_ui(rop, OP_);
|
|
assert(mpz_get_si(rop) = OP_);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_get_d_test;
|
|
const N = -1000;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op, N);
|
|
assert(mpz_get_d(op) = N);
|
|
mpz_clear(op)
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_get_d_2exp_test;
|
|
const
|
|
N_LG2 = 4;
|
|
N = 1 shl N_LG2;
|
|
var
|
|
op: mpz_t;
|
|
exp: mp_exp_t;
|
|
begin
|
|
mpz_init_set_si(op, N);
|
|
assert(mpz_get_d_2exp(exp, op) = 1 / 2);
|
|
assert(exp = N_LG2 + 1);
|
|
mpz_clear(op)
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_get_si_test;
|
|
const N = -1000000;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op, N);
|
|
assert(mpz_get_si(op) = N);
|
|
mpz_clear(op)
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_get_str_test;
|
|
const N = -1000000;
|
|
var
|
|
op: mpz_t;
|
|
p: pchar;
|
|
s0, s1: string;
|
|
begin
|
|
mpz_init_set_si(op, N);
|
|
s0 := inttostr(N);
|
|
p :=mpz_get_str(nil, BASE10, op);
|
|
assert(s0 = p);
|
|
freemem(p);
|
|
setlength(s1, length(s0));
|
|
assert(pointer(mpz_get_str(pchar(s1), BASE10, op)) = pointer(s1));
|
|
assert(s0 = s1);
|
|
mpz_clear(op)
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_get_ui_test;
|
|
const N = 1000000;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(op, N);
|
|
assert(mpz_get_ui(op) = N);
|
|
mpz_clear(op)
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_add_test;
|
|
const
|
|
OP_1 = -1000;
|
|
OP_2 = 1000000;
|
|
var rop, op1, op2: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
mpz_add(rop, op1, op2);
|
|
assert(mpz_get_si(rop) = OP_1 + OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_add_ui_test;
|
|
const
|
|
OP_1 = -1000;
|
|
OP_2 = 1000000;
|
|
var rop, op1: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_add_ui(rop, op1, OP_2);
|
|
assert(mpz_get_si(rop) = OP_1 + OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_sub_test;
|
|
const
|
|
OP_1 = -1000;
|
|
OP_2 = 1000000;
|
|
var rop, op1, op2: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
mpz_sub(rop, op1, op2);
|
|
assert(mpz_get_si(rop) = OP_1 - OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_sub_ui_test;
|
|
const
|
|
OP_1 = -1000;
|
|
OP_2 = 1000000;
|
|
var rop, op1: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_sub_ui(rop, op1, OP_2);
|
|
assert(mpz_get_si(rop) = OP_1 - OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_ui_sub_test;
|
|
const
|
|
OP_1 = 1000;
|
|
OP_2 = 1000000;
|
|
var rop, op2: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op2, OP_2);
|
|
mpz_ui_sub(rop, OP_1, op2);
|
|
assert(mpz_get_si(rop) = OP_1 - OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_mul_test;
|
|
const
|
|
OP_1 = -10;
|
|
OP_2 = 1000;
|
|
var rop, op1, op2: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
mpz_mul(rop, op1, op2);
|
|
assert(mpz_get_si(rop) = OP_1 * OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_mul_si_test;
|
|
const
|
|
OP_1 = 10;
|
|
OP_2 = -1000;
|
|
var rop, op1: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_mul_si(rop, op1, OP_2);
|
|
assert(mpz_get_si(rop) = OP_1 * OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_mul_ui_test;
|
|
const
|
|
OP_1 = -10;
|
|
OP_2 = 1000;
|
|
var rop, op1: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_mul_ui(rop, op1, OP_2);
|
|
assert(mpz_get_si(rop) = OP_1 * OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_addmul_test;
|
|
const
|
|
ROP_ = 10;
|
|
OP_1 = -100;
|
|
OP_2 = 1000;
|
|
var rop, op1, op2: mpz_t;
|
|
begin
|
|
mpz_init_set_si(rop, ROP_);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
mpz_addmul(rop, op1, op2);
|
|
assert(mpz_get_si(rop) = ROP_ + OP_1 * OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_addmul_ui_test;
|
|
const
|
|
ROP_ = 10;
|
|
OP_1 = -100;
|
|
OP_2 = 1000;
|
|
var rop, op1: mpz_t;
|
|
begin
|
|
mpz_init_set_si(rop, ROP_);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_addmul_ui(rop, op1, OP_2);
|
|
assert(mpz_get_si(rop) = ROP_ + OP_1 * OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_submul_test;
|
|
const
|
|
ROP_ = 10;
|
|
OP_1 = -100;
|
|
OP_2 = 1000;
|
|
var rop, op1, op2: mpz_t;
|
|
begin
|
|
mpz_init_set_si(rop, ROP_);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
mpz_submul(rop, op1, op2);
|
|
assert(mpz_get_si(rop) = ROP_ - OP_1 * OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_submul_ui_test;
|
|
const
|
|
ROP_ = 10;
|
|
OP_1 = -100;
|
|
OP_2 = 1000;
|
|
var rop, op1: mpz_t;
|
|
begin
|
|
mpz_init_set_si(rop, ROP_);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_submul_ui(rop, op1, OP_2);
|
|
assert(mpz_get_si(rop) = ROP_ - OP_1 * OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_mul_2exp_test;
|
|
const
|
|
OP_1 = 10;
|
|
OP_2 = 10;
|
|
var rop, op1: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_mul_2exp(rop, op1, OP_2);
|
|
assert(mpz_get_si(rop) = OP_1 * (1 shl OP_2));
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_neg_test;
|
|
const OP_ = 1000;
|
|
var rop, op: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op, OP_);
|
|
mpz_neg(rop, op);
|
|
assert(mpz_get_si(rop) = -OP_);
|
|
mpz_clear(rop);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_abs_test;
|
|
const OP_ = -1000;
|
|
var rop, op: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op, OP_);
|
|
mpz_abs(rop, op);
|
|
assert(mpz_get_si(rop) = abs(OP_));
|
|
mpz_clear(rop);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cdiv_q_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, n, d: mpz_t;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
mpz_cdiv_q(q, n, d);
|
|
assert(mpz_get_si(q) = ceil(N_ / D_));
|
|
mpz_clear(q);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fdiv_q_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, n, d: mpz_t;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
mpz_fdiv_q(q, n, d);
|
|
assert(mpz_get_si(q) = floor(N_ / D_));
|
|
mpz_clear(q);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_tdiv_q_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, n, d: mpz_t;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
mpz_tdiv_q(q, n, d);
|
|
assert(mpz_get_si(q) = trunc(N_ / D_));
|
|
mpz_clear(q);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cdiv_q_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var q, n: mpz_t;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_cdiv_q_2exp(q, n, B_);
|
|
assert(mpz_get_si(q) = ceil(N_ / D_));
|
|
mpz_clear(q);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fdiv_q_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var q, n: mpz_t;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_fdiv_q_2exp(q, n, B_);
|
|
assert(mpz_get_si(q) = floor(N_ / D_));
|
|
mpz_clear(q);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_tdiv_q_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var q, n: mpz_t;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_tdiv_q_2exp(q, n, B_);
|
|
assert(mpz_get_si(q) = trunc(N_ / D_));
|
|
mpz_clear(q);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cdiv_q_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, n: mpz_t;
|
|
ur: valuint;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init_set_si(n, N_);
|
|
ur :=mpz_cdiv_q_ui(q, n, D_);
|
|
assert(mpz_get_si(q) = ceil(N_ / D_));
|
|
assert(ur - abs(N_ -mpz_get_si(q) * D_) = 0);
|
|
mpz_clear(q);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fdiv_q_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, n: mpz_t;
|
|
ur: valuint;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init_set_si(n, N_);
|
|
ur :=mpz_fdiv_q_ui(q, n, D_);
|
|
assert(mpz_get_si(q) = floor(N_ / D_));
|
|
assert(ur - abs(N_ -mpz_get_si(q) * D_) = 0);
|
|
mpz_clear(q);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_tdiv_q_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, n: mpz_t;
|
|
ur: valuint;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init_set_si(n, N_);
|
|
ur :=mpz_tdiv_q_ui(q, n, D_);
|
|
assert(mpz_get_si(q) = trunc(N_ / D_));
|
|
assert(ur - abs(N_ -mpz_get_si(q) * D_) = 0);
|
|
mpz_clear(q);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cdiv_qr_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, r, n, d: mpz_t;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
mpz_cdiv_qr(q, r, n, d);
|
|
assert(mpz_get_si(q) = ceil(N_ / D_));
|
|
assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
|
|
mpz_clear(q);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fdiv_qr_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, r, n, d: mpz_t;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
mpz_fdiv_qr(q, r, n, d);
|
|
assert(mpz_get_si(q) = floor(N_ / D_));
|
|
assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
|
|
mpz_clear(q);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_tdiv_qr_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, r, n, d: mpz_t;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
mpz_tdiv_qr(q, r, n, d);
|
|
assert(mpz_get_si(q) = trunc(N_ / D_));
|
|
assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
|
|
mpz_clear(q);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cdiv_qr_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, r, n: mpz_t;
|
|
ur: valuint;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
ur :=mpz_cdiv_qr_ui(q, r, n, D_);
|
|
assert(mpz_get_si(q) = ceil(N_ / D_));
|
|
assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
|
|
assert(ur - abs(mpz_get_si(r)) = 0);
|
|
mpz_clear(q);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fdiv_qr_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, r, n: mpz_t;
|
|
ur: valuint;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
ur :=mpz_fdiv_qr_ui(q, r, n, D_);
|
|
assert(mpz_get_si(q) = floor(N_ / D_));
|
|
assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
|
|
assert(ur - abs(mpz_get_si(r)) = 0);
|
|
mpz_clear(q);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_tdiv_qr_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, r, n: mpz_t;
|
|
ur: valuint;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
ur :=mpz_tdiv_qr_ui(q, r, n, D_);
|
|
assert(mpz_get_si(q) = trunc(N_ / D_));
|
|
assert(mpz_get_si(q) * D_ + mpz_get_si(r) = N_);
|
|
assert(ur - abs(mpz_get_si(r)) = 0);
|
|
mpz_clear(q);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cdiv_r_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var r, n, d: mpz_t;
|
|
begin
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
mpz_cdiv_r(r, n, d);
|
|
assert(ceil(N_ / D_) * D_ + mpz_get_si(r) = N_);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fdiv_r_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var r, n, d: mpz_t;
|
|
begin
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
mpz_fdiv_r(r, n, d);
|
|
assert(floor(N_ / D_) * D_ + mpz_get_si(r) = N_);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_tdiv_r_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var r, n, d: mpz_t;
|
|
begin
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
mpz_tdiv_r(r, n, d);
|
|
assert(trunc(N_ / D_) * D_ + mpz_get_si(r) = N_);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cdiv_r_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var r, n: mpz_t;
|
|
begin
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_cdiv_r_2exp(r, n, B_);
|
|
assert(ceil(N_ / D_) * D_ + mpz_get_si(r) = N_);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fdiv_r_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var r, n: mpz_t;
|
|
begin
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_fdiv_r_2exp(r, n, B_);
|
|
assert(floor(N_ / D_) * D_ + mpz_get_si(r) = N_);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_tdiv_r_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var r, n: mpz_t;
|
|
begin
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_tdiv_r_2exp(r, n, B_);
|
|
assert(trunc(N_ / D_) * D_ + mpz_get_si(r) = N_);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cdiv_r_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
r, n: mpz_t;
|
|
ur: valuint;
|
|
begin
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
ur :=mpz_cdiv_r_ui(r, n, D_);
|
|
assert(ceil(N_ / D_) * D_ + mpz_get_si(r) = N_);
|
|
assert(ur - abs(mpz_get_si(r)) = 0);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fdiv_r_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
r, n: mpz_t;
|
|
ur: valuint;
|
|
begin
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
ur :=mpz_fdiv_r_ui(r, n, D_);
|
|
assert(floor(N_ / D_) * D_ + mpz_get_si(r) = N_);
|
|
assert(ur - abs(mpz_get_si(r)) = 0);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_tdiv_r_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
r, n: mpz_t;
|
|
ur: valuint;
|
|
begin
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
ur :=mpz_tdiv_r_ui(r, n, D_);
|
|
assert(trunc(N_ / D_) * D_ + mpz_get_si(r) = N_);
|
|
assert(ur - abs(mpz_get_si(r)) = 0);
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cdiv_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var n: mpz_t;
|
|
begin
|
|
mpz_init_set_si(n, N_);
|
|
assert(mpz_cdiv_ui(n, D_) - abs(N_ - ceil(N_ / D_) * D_) = 0);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fdiv_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var n: mpz_t;
|
|
begin
|
|
mpz_init_set_si(n, N_);
|
|
assert(mpz_fdiv_ui(n, D_) - abs(N_ - floor(N_ / D_) * D_) = 0);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_tdiv_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var n: mpz_t;
|
|
begin
|
|
mpz_init_set_si(n, N_);
|
|
assert(mpz_tdiv_ui(n, D_) = abs(N_ - trunc(N_ / D_) * D_));
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_mod_test;
|
|
const
|
|
N_ = 17;
|
|
D_ = -4;
|
|
var r, n, d: mpz_t;
|
|
begin
|
|
mpz_init(r);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
mpz_mod(r, n, d);
|
|
assert(mpz_get_si(r) = N_ mod abs(D_));
|
|
mpz_clear(r);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_divexact_test;
|
|
const
|
|
N_ = -16;
|
|
D_ = 4;
|
|
var q, n, d: mpz_t;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
mpz_divexact(q, n, d);
|
|
assert(mpz_get_si(q) * D_ = N_);
|
|
mpz_clear(q);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_divexact_ui_test;
|
|
const
|
|
N_ = -16;
|
|
D_ = 4;
|
|
var q, n: mpz_t;
|
|
begin
|
|
mpz_init(q);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_divexact_ui(q, n, D_);
|
|
assert(mpz_get_si(q) * D_ = N_);
|
|
mpz_clear(q);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_divisible_p_test;
|
|
const
|
|
N_ = -16;
|
|
D_ = 4;
|
|
var n, d: mpz_t;
|
|
begin
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(d, D_);
|
|
assert(mpz_divisible_p(n, d) <> 0);
|
|
mpz_set_si(n,mpz_get_si(n) + 1);
|
|
assert(mpz_divisible_p(n, d) = 0);
|
|
mpz_clear(n);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_divisible_ui_p_test;
|
|
const
|
|
N_ = -16;
|
|
D_ = 4;
|
|
var n: mpz_t;
|
|
begin
|
|
mpz_init_set_si(n, N_);
|
|
assert(mpz_divisible_ui_p(n, D_) <> 0);
|
|
mpz_set_si(n,mpz_get_si(n) + 1);
|
|
assert(mpz_divisible_ui_p(n, D_) = 0);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_divisible_2exp_p_test;
|
|
const
|
|
N_ = -16;
|
|
B_ = 2;
|
|
var n: mpz_t;
|
|
begin
|
|
mpz_init_set_si(n, N_);
|
|
assert(mpz_divisible_2exp_p(n, B_) <> 0);
|
|
mpz_set_si(n,mpz_get_si(n) + 1);
|
|
assert(mpz_divisible_ui_p(n, B_) = 0);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_congruent_p_test;
|
|
const
|
|
N_ = 23;
|
|
C_ = 6;
|
|
D_ = 17;
|
|
var n, c, d: mpz_t;
|
|
begin
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(c, C_);
|
|
mpz_init_set_si(d, D_);
|
|
assert(mpz_congruent_p(n, c, d) <> 0);
|
|
mpz_set_si(n,mpz_get_si(n) + 1);
|
|
assert(mpz_congruent_p(n, c, d) = 0);
|
|
mpz_clear(n);
|
|
mpz_clear(c);
|
|
mpz_clear(d);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_congruent_2exp_p_test;
|
|
const
|
|
N_ = 23;
|
|
C_ = 7;
|
|
B_ = 4;
|
|
var n, c: mpz_t;
|
|
begin
|
|
mpz_init_set_si(n, N_);
|
|
mpz_init_set_si(c, C_);
|
|
assert(mpz_congruent_2exp_p(n, c, B_) <> 0);
|
|
mpz_set_si(n,mpz_get_si(n) + 1);
|
|
assert(mpz_congruent_2exp_p(n, c, B_) = 0);
|
|
mpz_clear(n);
|
|
mpz_clear(c);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_congruent_ui_p_test;
|
|
const
|
|
N_ = 23;
|
|
C_ = 6;
|
|
D_ = 17;
|
|
var n: mpz_t;
|
|
begin
|
|
mpz_init_set_si(n, N_);
|
|
assert(mpz_congruent_ui_p(n, C_, D_) <> 0);
|
|
mpz_set_si(n,mpz_get_si(n) + 1);
|
|
assert(mpz_congruent_ui_p(n, C_, D_) = 0);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_powm_test;
|
|
const
|
|
N_EXP = 3;
|
|
N_MOD = 16;
|
|
ROP_ = 8;
|
|
var rop, base, exp, mod_: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(base, BASE10);
|
|
mpz_init_set_si(exp, N_EXP);
|
|
mpz_init_set_si(mod_, N_MOD);
|
|
mpz_powm(rop, base, exp, mod_);
|
|
assert(mpz_get_si(rop) = ROP_);
|
|
mpz_clear(rop);
|
|
mpz_clear(base);
|
|
mpz_clear(exp);
|
|
mpz_clear(mod_);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_powm_ui_test;
|
|
const
|
|
N_EXP = 3;
|
|
N_MOD = 16;
|
|
ROP_ = 8;
|
|
var rop, base, mod_: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(base, BASE10);
|
|
mpz_init_set_si(mod_, N_MOD);
|
|
mpz_powm_ui(rop, base, N_EXP, mod_);
|
|
assert(mpz_get_si(rop) = ROP_);
|
|
mpz_clear(rop);
|
|
mpz_clear(base);
|
|
mpz_clear(mod_);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_pow_ui_test;
|
|
const
|
|
BASE_ = 10;
|
|
EXP = 3;
|
|
var rop, base: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(base, BASE_);
|
|
mpz_pow_ui(rop, base, EXP);
|
|
assert(mpz_get_si(rop) = BASE_ ** EXP);
|
|
mpz_clear(rop);
|
|
mpz_clear(base);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_ui_pow_ui_test;
|
|
const
|
|
BASE_ = 10;
|
|
EXP = 3;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_ui_pow_ui(rop, BASE_, EXP);
|
|
assert(mpz_get_si(rop) = BASE_ ** EXP);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_root_test;
|
|
const
|
|
ROOT = 5;
|
|
N_ = 3;
|
|
var rop, op: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op, ROOT ** N_);
|
|
assert(mpz_root(rop, op, N_) <> 0);
|
|
assert(mpz_get_si(rop) = ROOT);
|
|
mpz_set_si(op, ROOT ** N_ + 1);
|
|
assert(mpz_root(rop, op, N_) = 0);
|
|
assert(mpz_get_si(rop) = ROOT);
|
|
mpz_clear(rop);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_rootrem_test;
|
|
const
|
|
ROOT_ = 5;
|
|
N_ = 3;
|
|
REM_ = 1;
|
|
var root, rem, u: mpz_t;
|
|
begin
|
|
assert(REM_ < ROOT_);
|
|
mpz_init(root);
|
|
mpz_init(rem);
|
|
mpz_init_set_si(u, ROOT_ ** N_);
|
|
mpz_rootrem(root, rem, u, N_);
|
|
assert(mpz_get_si(root) = ROOT_);
|
|
assert(mpz_get_si(rem) = 0);
|
|
mpz_set_si(u, ROOT_ ** N_ + REM_);
|
|
mpz_rootrem(root, rem, u, N_);
|
|
assert(mpz_get_si(root) = ROOT_);
|
|
assert(mpz_get_si(rem) = REM_);
|
|
mpz_clear(root);
|
|
mpz_clear(rem);
|
|
mpz_clear(u);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_sqrt_test;
|
|
const ROOT = 5;
|
|
var rop, op: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op, ROOT ** 2);
|
|
mpz_sqrt(rop, op);
|
|
assert(mpz_get_si(rop) = ROOT);
|
|
mpz_clear(rop);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_sqrtrem_test;
|
|
const
|
|
ROOT = 5;
|
|
REM = 1;
|
|
var rop1, rop2, op: mpz_t;
|
|
begin
|
|
mpz_init(rop1);
|
|
mpz_init(rop2);
|
|
mpz_init_set_si(op, ROOT ** 2 + REM);
|
|
mpz_sqrtrem(rop1, rop2, op);
|
|
assert(mpz_get_si(rop1) = ROOT);
|
|
assert(mpz_get_si(rop2) = REM);
|
|
mpz_clear(rop1);
|
|
mpz_clear(rop2);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_perfect_power_p_test;
|
|
const
|
|
ROOT = 3;
|
|
EXP = 3;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op, ROOT ** EXP);
|
|
assert(mpz_perfect_power_p(op) <> 0);
|
|
mpz_set_si(op, ROOT ** EXP + 1);
|
|
assert(mpz_perfect_power_p(op) = 0);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_perfect_square_p_test;
|
|
const ROOT = 3;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op, ROOT ** 2);
|
|
assert(mpz_perfect_square_p(op) <> 0);
|
|
mpz_set_si(op, ROOT ** 2 or 2);
|
|
assert(mpz_perfect_square_p(op) = 0);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_probab_prime_p_test;
|
|
const
|
|
N_ = 127;
|
|
REPS = 5;
|
|
var n: mpz_t;
|
|
begin
|
|
mpz_init_set_si(n, N_);
|
|
assert(mpz_probab_prime_p(n, REPS) = 2);
|
|
mpz_set_si(n, N_ + 1);
|
|
assert(mpz_probab_prime_p(n, REPS) = 0);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_nextprime_test;
|
|
const
|
|
PRIME3 = 5;
|
|
PRIME4 = 7;
|
|
var rop, op: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op, PRIME3);
|
|
mpz_nextprime(rop, op);
|
|
assert(mpz_get_si(rop) = PRIME4);
|
|
mpz_clear(rop);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_gcd_test;
|
|
const
|
|
OP_1 = 42;
|
|
OP_2 = 56;
|
|
ROP_ = 14;
|
|
var rop, op1, op2: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
mpz_gcd(rop, op1, op2);
|
|
assert(mpz_get_si(rop) = ROP_);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_gcd_ui_test;
|
|
const
|
|
OP_1 = 42;
|
|
OP_2 = 56;
|
|
ROP_ = 14;
|
|
var rop, op1: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
assert(mpz_gcd_ui(rop, op1, OP_2) = ROP_);
|
|
assert(mpz_get_si(rop) = ROP_);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_gcdext_test;
|
|
const
|
|
A_ = 42;
|
|
B_ = 56;
|
|
G_ = 14;
|
|
var g, s, t, a, b: mpz_t;
|
|
begin
|
|
mpz_init(g);
|
|
mpz_init(s);
|
|
mpz_init(t);
|
|
mpz_init_set_si(a, A_);
|
|
mpz_init_set_si(b, B_);
|
|
mpz_gcdext(g, s, t, a, b);
|
|
assert(mpz_get_si(g) = G_);
|
|
assert(A_ *mpz_get_si(s) + B_ *mpz_get_si(t) = G_);
|
|
mpz_clear(g);
|
|
mpz_clear(s);
|
|
mpz_clear(t);
|
|
mpz_clear(a);
|
|
mpz_clear(b);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_lcm_test;
|
|
const
|
|
OP_1 = 21;
|
|
OP_2 = 6;
|
|
ROP_ = 42;
|
|
var rop, op1, op2: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
mpz_lcm(rop, op1, op2);
|
|
assert(mpz_get_si(rop) = ROP_);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_lcm_ui_test;
|
|
const
|
|
OP_1 = 21;
|
|
OP_2 = 6;
|
|
ROP_ = 42;
|
|
var rop, op1: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_lcm_ui(rop, op1, OP_2);
|
|
assert(mpz_get_si(rop) = ROP_);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_invert_test;
|
|
const
|
|
OP_1 = 256;
|
|
OP_2 = 337;
|
|
ROP_ = 104;
|
|
var rop, op1, op2: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
assert(mpz_invert(rop, op1, op2) <> 0);
|
|
assert(mpz_get_si(rop) = ROP_);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_jacobi_test;
|
|
const
|
|
B0 = 11;
|
|
A0 = 13 * B0;
|
|
AM1 = 1001;
|
|
BM1 = 9907;
|
|
A1 = 4;
|
|
B1 = 7;
|
|
var a, b: mpz_t;
|
|
begin
|
|
mpz_init_set_si(a, A0);
|
|
mpz_init_set_si(b, B0);
|
|
assert(mpz_jacobi(a, b) = 0);
|
|
mpz_set_si(a, AM1);
|
|
mpz_set_si(b, BM1);
|
|
assert(mpz_jacobi(a, b) = -1);
|
|
mpz_set_si(a, A1);
|
|
mpz_set_si(b, B1);
|
|
assert(mpz_jacobi(a, b) = 1);
|
|
mpz_clear(a);
|
|
mpz_clear(b);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_kronecker_si_test;
|
|
const
|
|
A_ = 8;
|
|
B0 = 6;
|
|
BM1 = 5;
|
|
B1 = 7;
|
|
var a: mpz_t;
|
|
begin
|
|
mpz_init_set_si(a, A_);
|
|
assert(mpz_kronecker_si(a, B1) = 1);
|
|
assert(mpz_kronecker_si(a, B0) = 0);
|
|
assert(mpz_kronecker_si(a, BM1) = -1);
|
|
mpz_clear(a);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_kronecker_ui_test;
|
|
const
|
|
A_ = 8;
|
|
B0 = 6;
|
|
BM1 = 5;
|
|
B1 = 7;
|
|
var a: mpz_t;
|
|
begin
|
|
mpz_init_set_si(a, A_);
|
|
assert(mpz_kronecker_ui(a, B1) = 1);
|
|
assert(mpz_kronecker_ui(a, B0) = 0);
|
|
assert(mpz_kronecker_ui(a, BM1) = -1);
|
|
mpz_clear(a);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_si_kronecker_test;
|
|
const
|
|
A_ = 8;
|
|
B0 = 6;
|
|
BM1 = 5;
|
|
B1 = 7;
|
|
var b: mpz_t;
|
|
begin
|
|
mpz_init_set_si(b, B1);
|
|
assert(mpz_si_kronecker(A_, b) = 1);
|
|
mpz_set_si(b, B0);
|
|
assert(mpz_si_kronecker(A_, b) = 0);
|
|
mpz_set_si(b, BM1);
|
|
assert(mpz_si_kronecker(A_, b) = -1);
|
|
mpz_clear(b);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_ui_kronecker_test;
|
|
const
|
|
A_ = 8;
|
|
B0 = 6;
|
|
BM1 = 5;
|
|
B1 = 7;
|
|
var b: mpz_t;
|
|
begin
|
|
mpz_init_set_si(b, B1);
|
|
assert(mpz_ui_kronecker(A_, b) = 1);
|
|
mpz_set_si(b, B0);
|
|
assert(mpz_ui_kronecker(A_, b) = 0);
|
|
mpz_set_si(b, BM1);
|
|
assert(mpz_ui_kronecker(A_, b) = -1);
|
|
mpz_clear(b);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_remove_test;
|
|
const
|
|
F_ = 5;
|
|
OP_ = 3 * F_ * 7;
|
|
ROP_ = OP_ div F_;
|
|
var rop, op, f: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op, OP_);
|
|
mpz_init_set_si(f, F_);
|
|
assert(mpz_remove(rop, op, f) = 1);
|
|
assert(mpz_get_si(rop) = ROP_);
|
|
mpz_clear(rop);
|
|
mpz_clear(op);
|
|
mpz_clear(f);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fac_ui_test;
|
|
const
|
|
OP = 4;
|
|
ROP_ = 2 * 3 * 4;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_fac_ui(rop, OP);
|
|
assert(mpz_get_si(rop) = ROP_);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_bin_ui_test;
|
|
const
|
|
N_ = 7;
|
|
K = 3;
|
|
ROP_ = 35;
|
|
var rop, n: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(n, N_);
|
|
mpz_bin_ui(rop, n, K);
|
|
assert(mpz_get_si(rop) = ROP_);
|
|
mpz_clear(rop);
|
|
mpz_clear(n);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_bin_uiui_test;
|
|
const
|
|
N = 7;
|
|
K = 3;
|
|
ROP_ = 35;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_bin_uiui(rop, N, K);
|
|
assert(mpz_get_si(rop) = ROP_);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fib_ui_test;
|
|
const
|
|
N = 10;
|
|
FN_ = 55;
|
|
var fn: mpz_t;
|
|
begin
|
|
mpz_init(fn);
|
|
mpz_fib_ui(fn, N);
|
|
assert(mpz_get_si(fn) = FN_);
|
|
mpz_clear(fn);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fib2_ui_test;
|
|
const
|
|
N = 10;
|
|
FN_ = 55;
|
|
FNSUB1_ = 34;
|
|
var fn, fnsub1: mpz_t;
|
|
begin
|
|
mpz_init(fn);
|
|
mpz_init(fnsub1);
|
|
mpz_fib2_ui(fn, fnsub1, N);
|
|
assert(mpz_get_si(fn) = FN_);
|
|
assert(mpz_get_si(fnsub1) = FNSUB1_);
|
|
mpz_clear(fn);
|
|
mpz_clear(fnsub1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_lucnum_ui_test;
|
|
const
|
|
N = 10;
|
|
LN_ = 123;
|
|
var ln: mpz_t;
|
|
begin
|
|
mpz_init(ln);
|
|
mpz_lucnum_ui(ln, N);
|
|
assert(mpz_get_si(ln) = LN_);
|
|
mpz_clear(ln);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_lucnum2_ui_test;
|
|
const
|
|
N = 10;
|
|
LN_ = 123;
|
|
LNSUB1_ = 76;
|
|
var ln, lnsub1: mpz_t;
|
|
begin
|
|
mpz_init(ln);
|
|
mpz_init(lnsub1);
|
|
mpz_lucnum2_ui(ln, lnsub1, N);
|
|
assert(mpz_get_si(ln) = LN_);
|
|
assert(mpz_get_si(lnsub1) = LNSUB1_);
|
|
mpz_clear(ln);
|
|
mpz_clear(lnsub1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cmp_test;
|
|
const
|
|
OP_1 = -10;
|
|
OP_2 = OP_1 - 1;
|
|
var op1, op2: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
assert(mpz_cmp(op1, op2) > 0);
|
|
mpz_set_si(op2, OP_1);
|
|
assert(mpz_cmp(op1, op2) = 0);
|
|
mpz_set_si(op2, OP_1 + 1);
|
|
assert(mpz_cmp(op1, op2) < 0);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cmp_d_test;
|
|
const
|
|
OP_1 = -10;
|
|
var op1: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op1, OP_1);
|
|
assert(mpz_cmp_d(op1, OP_1 - 1) > 0);
|
|
assert(mpz_cmp_d(op1, OP_1) = 0);
|
|
assert(mpz_cmp_d(op1, OP_1 + 1) < 0);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cmp_si_test;
|
|
const
|
|
OP_1 = -10;
|
|
var op1: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op1, OP_1);
|
|
assert(mpz_cmp_si(op1, OP_1 - 1) > 0);
|
|
assert(mpz_cmp_si(op1, OP_1) = 0);
|
|
assert(mpz_cmp_si(op1, OP_1 + 1) < 0);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cmp_ui_test;
|
|
const
|
|
OP_1 = 10;
|
|
var op1: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op1, OP_1);
|
|
assert(mpz_cmp_ui(op1, OP_1 - 1) > 0);
|
|
assert(mpz_cmp_ui(op1, OP_1) = 0);
|
|
assert(mpz_cmp_ui(op1, OP_1 + 1) < 0);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cmpabs_test;
|
|
const
|
|
OP_1 = -10;
|
|
OP_2 = -OP_1 - 1;
|
|
var op1, op2: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, -OP_2);
|
|
assert(mpz_cmpabs(op1, op2) > 0);
|
|
mpz_set_si(op2, -OP_1);
|
|
assert(mpz_cmpabs(op1, op2) = 0);
|
|
mpz_set_si(op2, -OP_1 + 1);
|
|
assert(mpz_cmpabs(op1, op2) < 0);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cmpabs_d_test;
|
|
const OP_1 = -10;
|
|
var op1: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op1, OP_1);
|
|
assert(mpz_cmpabs_d(op1, -OP_1 - 1) > 0);
|
|
assert(mpz_cmpabs_d(op1, -OP_1) = 0);
|
|
assert(mpz_cmpabs_d(op1, -OP_1 + 1) < 0);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_cmpabs_ui_test;
|
|
const OP_1 = -10;
|
|
var op1: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op1, OP_1);
|
|
assert(mpz_cmpabs_ui(op1, -OP_1 - 1) > 0);
|
|
assert(mpz_cmpabs_ui(op1, -OP_1) = 0);
|
|
assert(mpz_cmpabs_ui(op1, -OP_1 + 1) < 0);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_and_test;
|
|
const
|
|
OP_1 = $c;
|
|
OP_2 = $a;
|
|
var rop, op1, op2: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
mpz_and(rop, op1, op2);
|
|
assert(mpz_get_si(rop) = OP_1 and OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_ior_test;
|
|
const
|
|
OP_1 = $c;
|
|
OP_2 = $a;
|
|
var rop, op1, op2: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
mpz_ior(rop, op1, op2);
|
|
assert(mpz_get_si(rop) = OP_1 or OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_xor_test;
|
|
const
|
|
OP_1 = $c;
|
|
OP_2 = $a;
|
|
var rop, op1, op2: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
mpz_xor(rop, op1, op2);
|
|
assert(mpz_get_si(rop) = OP_1 xor OP_2);
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_com_test;
|
|
const
|
|
OP_1 = 2;
|
|
var rop, op1: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_com(rop, op1);
|
|
assert(mpz_get_si(rop) = not OP_1 );
|
|
mpz_clear(rop);
|
|
mpz_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_popcount_test;
|
|
const
|
|
OP_ = $55AA;
|
|
N = 8;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op, OP_);
|
|
assert(mpz_popcount(op) = N);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_hamdist_test;
|
|
const
|
|
OP_1 = $55;
|
|
OP_2 = $7A;
|
|
N = 5;
|
|
var op1, op2: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op1, OP_1);
|
|
mpz_init_set_si(op2, OP_2);
|
|
assert(mpz_hamdist(op1, op2) = N);
|
|
mpz_clear(op1);
|
|
mpz_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_scan0_test;
|
|
const
|
|
OP_ = $F75;
|
|
STARTING_BIT = 4;
|
|
N = 7;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op, OP_);
|
|
assert(mpz_scan0(op, STARTING_BIT) = N);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_scan1_test;
|
|
const
|
|
OP_ = $85;
|
|
STARTING_BIT = 4;
|
|
N = 7;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op, OP_);
|
|
assert(mpz_scan1(op, STARTING_BIT) = N);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_setbit_test;
|
|
const
|
|
ROP_ = $F75;
|
|
BIT_INDEX = 7;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(rop, ROP_);
|
|
mpz_setbit(rop, BIT_INDEX);
|
|
assert(mpz_get_ui(rop) = ROP_ or (1 shl BIT_INDEX));
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_clrbit_test;
|
|
const
|
|
ROP_ = $F75;
|
|
BIT_INDEX = 9;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(rop, ROP_);
|
|
mpz_clrbit(rop, BIT_INDEX);
|
|
assert(mpz_get_ui(rop) = ROP_ and not (1 shl BIT_INDEX));
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_combit_test;
|
|
const
|
|
ROP_ = $F75;
|
|
BIT_INDEX = 7;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(rop, ROP_);
|
|
mpz_combit(rop, BIT_INDEX);
|
|
assert(mpz_get_ui(rop) = ROP_ xor (1 shl BIT_INDEX));
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_tstbit_test;
|
|
const
|
|
ROP_ = $F75;
|
|
BIT_INDEX1 = 7;
|
|
BIT_INDEX2 = 8;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(rop, ROP_);
|
|
assert(longbool(mpz_tstbit(rop, BIT_INDEX1)) = longbool(ROP_ and (1 shl BIT_INDEX1)));
|
|
assert(longbool(mpz_tstbit(rop, BIT_INDEX2)) = longbool(ROP_ and (1 shl BIT_INDEX2)));
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_urandomb_test;
|
|
const
|
|
B = 8 * (sizeof(valuint) - 1);
|
|
N = 1 shl B;
|
|
var
|
|
rop: mpz_t;
|
|
state: randstate_t;
|
|
begin
|
|
mp_randinit_default(state);
|
|
mpz_init(rop);
|
|
mpz_urandomb(rop, state, B);
|
|
assert(mpz_cmp_ui(rop, N) < 0);
|
|
mpz_clear(rop);
|
|
mp_randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_urandomm_test;
|
|
const
|
|
N_ = 1000000;
|
|
var
|
|
rop, n: mpz_t;
|
|
state: randstate_t;
|
|
begin
|
|
mp_randinit_default(state);
|
|
mpz_init(rop);
|
|
mpz_init_set_ui(n, N_);
|
|
mpz_urandomm(rop, state, n);
|
|
assert(mpz_cmp_ui(rop, N_) < 0);
|
|
mpz_clear(rop);
|
|
mpz_clear(n);
|
|
mp_randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_rrandomb_test;
|
|
const
|
|
B = 8 * sizeof(valuint) - 2;
|
|
N = 1 shl B;
|
|
var
|
|
rop: mpz_t;
|
|
state: randstate_t;
|
|
begin
|
|
mp_randinit_default(state);
|
|
mpz_init(rop);
|
|
mpz_rrandomb(rop, state, B);
|
|
assert(mpz_cmp_ui(rop, N) < 0);
|
|
mpz_clear(rop);
|
|
mp_randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fits_ushort_p_test;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(op, high(word));
|
|
assert(longbool(mpz_fits_ushort_p(op)));
|
|
mpz_add_ui(op, op, 1);
|
|
assert(not longbool(mpz_fits_ushort_p(op)));
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fits_sshort_p_test;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op, high(smallint));
|
|
assert(longbool(mpz_fits_sshort_p(op)));
|
|
mpz_add_ui(op, op, 1);
|
|
assert(not longbool(mpz_fits_sshort_p(op)));
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fits_uint_p_test;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(op, high(cardinal));
|
|
assert(longbool(mpz_fits_uint_p(op)));
|
|
mpz_add_ui(op, op, 1);
|
|
assert(not longbool(mpz_fits_uint_p(op)));
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fits_sint_p_test;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op, high(integer));
|
|
assert(longbool(mpz_fits_sint_p(op)));
|
|
mpz_add_ui(op, op, 1);
|
|
assert(not longbool(mpz_fits_sint_p(op)));
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fits_ulong_p_test;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(op, high(valuint));
|
|
assert(longbool(mpz_fits_ulong_p(op)));
|
|
mpz_add_ui(op, op, 1);
|
|
assert(not longbool(mpz_fits_ulong_p(op)));
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_fits_slong_p_test;
|
|
var op: mpz_t;
|
|
begin
|
|
mpz_init_set_si(op, high(valsint));
|
|
assert(longbool(mpz_fits_slong_p(op)));
|
|
mpz_add_ui(op, op, 1);
|
|
assert(not longbool(mpz_fits_slong_p(op)));
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_sizeinbase_test;
|
|
const
|
|
OP_ = 1000000;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init_set_ui(rop, OP_);
|
|
assert(mpz_sizeinbase(rop, BASE10) - length(inttostr(OP_)) = 0);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpz_size_test;
|
|
var rop: mpz_t;
|
|
begin
|
|
mpz_init(rop);
|
|
assert(mpz_size(rop) = 0);
|
|
mpz_add_ui(rop, rop, 1);
|
|
assert(mpz_size(rop) = 1);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_init_test;
|
|
var rational: mpq_t;
|
|
begin
|
|
mpq_init(rational);
|
|
assert(mpq_cmp_ui(rational, 0, 1) = 0);
|
|
mpq_clear(rational);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_clear_test;
|
|
var rational: mpq_t;
|
|
begin
|
|
mpq_init(rational);
|
|
mpq_clear(rational);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_set_ui_test;
|
|
const
|
|
OP_1 = 13;
|
|
OP_2 = 17;
|
|
var rational: mpq_t;
|
|
begin
|
|
mpq_init(rational);
|
|
mpq_set_ui(rational, OP_1, OP_2);
|
|
assert(mpq_cmp_ui(rational, OP_1, OP_2) = 0);
|
|
mpq_clear(rational);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_set_si_test;
|
|
const
|
|
OP_1 = -13;
|
|
OP_2 = 17;
|
|
var rational: mpq_t;
|
|
begin
|
|
mpq_init(rational);
|
|
mpq_set_si(rational, OP_1, OP_2);
|
|
assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
|
|
mpq_clear(rational);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_canonicalize_test;
|
|
const
|
|
OP_1 = -13;
|
|
OP_2 = 17;
|
|
CF = 11;
|
|
var rational: mpq_t;
|
|
begin
|
|
mpq_init(rational);
|
|
mpq_set_si(rational, CF * OP_1, CF * OP_2);
|
|
mpq_canonicalize(rational);
|
|
assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
|
|
mpq_clear(rational);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_set_test;
|
|
const
|
|
OP_1 = -13;
|
|
OP_2 = 17;
|
|
var rational1, rational2: mpq_t;
|
|
begin
|
|
mpq_init(rational1);
|
|
mpq_init(rational2);
|
|
mpq_set_si(rational2, OP_1, OP_2);
|
|
mpq_set(rational1, rational2);
|
|
assert(mpq_cmp_si(rational1, OP_1, OP_2) = 0);
|
|
mpq_clear(rational1);
|
|
mpq_clear(rational2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_setmpz_test;
|
|
const
|
|
OP_1 = -13;
|
|
var
|
|
rational: mpq_t;
|
|
op: mpz_t;
|
|
begin
|
|
mpq_init(rational);
|
|
mpz_init_set_si(op, OP_1);
|
|
mpq_set_z(rational, op);
|
|
assert(mpq_cmp_si(rational, OP_1, 1) = 0);
|
|
mpq_clear(rational);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_set_str_test;
|
|
const
|
|
OP_1 = -13;
|
|
OP_2 = 17;
|
|
var rational: mpq_t;
|
|
begin
|
|
mpq_init(rational);
|
|
assert(mpq_set_str(rational, pchar(inttostr(OP_1) + '/' + inttostr(OP_2)), BASE10) = 0);
|
|
assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
|
|
assert(mpq_set_str(rational, pchar(inttostr(OP_1) + '*' + inttostr(OP_2)), BASE10) <> 0);
|
|
mpq_clear(rational);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_swap_test;
|
|
const
|
|
ROP_1N = -13;
|
|
ROP_1D = 17;
|
|
ROP_2N = -23;
|
|
ROP_2D = 31;
|
|
var rop1, rop2: mpq_t;
|
|
begin
|
|
mpq_init(rop1);
|
|
mpq_init(rop2);
|
|
mpq_set_si(rop1, ROP_1N, ROP_1D);
|
|
mpq_set_si(rop2, ROP_2N, ROP_2D);
|
|
mpq_swap(rop1, rop2);
|
|
assert(mpq_cmp_si(rop1, ROP_2N, ROP_2D) = 0);
|
|
assert(mpq_cmp_si(rop2, ROP_1N, ROP_1D) = 0);
|
|
mpq_clear(rop1);
|
|
mpq_clear(rop2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_get_d_test;
|
|
const
|
|
OP_1 = -1;
|
|
OP_2 = 2;
|
|
var op: mpq_t;
|
|
begin
|
|
mpq_init(op);
|
|
mpq_set_si(op, OP_1, OP_2);
|
|
assert(mpq_get_d(op) = OP_1 / OP_2);
|
|
mpq_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_set_d_test;
|
|
const
|
|
OP_1 = -1;
|
|
OP_2 = 2;
|
|
var rop: mpq_t;
|
|
begin
|
|
mpq_init(rop);
|
|
mpq_set_d(rop, OP_1 / OP_2);
|
|
assert(mpq_cmp_si(rop, OP_1, OP_2) = 0);
|
|
mpq_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_set_f_test;
|
|
const OP_ = -10;
|
|
var
|
|
op: mpf_t;
|
|
rop: mpq_t;
|
|
begin
|
|
mpf_init_set_si(op, OP_);
|
|
mpq_init(rop);
|
|
mpq_set_f(rop, op);
|
|
assert(mpq_get_d(rop) = OP_);
|
|
mpq_clear(rop);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_get_str_test;
|
|
const
|
|
OP_1 = -1;
|
|
OP_2 = 2;
|
|
var
|
|
op: mpq_t;
|
|
p: pchar;
|
|
begin
|
|
mpq_init(op);
|
|
mpq_set_si(op, OP_1, OP_2);
|
|
p := mpq_get_str(nil, BASE10, op);
|
|
assert(p = inttostr(OP_1) + '/' + inttostr(OP_2));
|
|
freemem(p);
|
|
mpq_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_add_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var sum, addend1, addend2: mpq_t;
|
|
begin
|
|
mpq_init(sum);
|
|
mpq_init(addend1);
|
|
mpq_init(addend2);
|
|
mpq_set_si(addend1, N1, D1);
|
|
mpq_set_si(addend2, N2, D2);
|
|
mpq_add(sum, addend1, addend2);
|
|
assert(mpq_cmp_si(sum, N1 * D2 + N2 * D1, D1 * D2) = 0);
|
|
mpq_clear(sum);
|
|
mpq_clear(addend1);
|
|
mpq_clear(addend2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_sub_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var difference, minuend, subtrahend: mpq_t;
|
|
begin
|
|
mpq_init(difference);
|
|
mpq_init(minuend);
|
|
mpq_init(subtrahend);
|
|
mpq_set_si(minuend, N1, D1);
|
|
mpq_set_si(subtrahend, N2, D2);
|
|
mpq_sub(difference, minuend, subtrahend);
|
|
assert(mpq_cmp_si(difference, N1 * D2 - N2 * D1, D1 * D2) = 0);
|
|
mpq_clear(difference);
|
|
mpq_clear(minuend);
|
|
mpq_clear(subtrahend);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_mul_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var product, multiplier, multiplicant: mpq_t;
|
|
begin
|
|
mpq_init(product);
|
|
mpq_init(multiplier);
|
|
mpq_init(multiplicant);
|
|
mpq_set_si(multiplier, N1, D1);
|
|
mpq_set_si(multiplicant, N2, D2);
|
|
mpq_mul(product, multiplier, multiplicant);
|
|
assert(mpq_cmp_si(product, N1 * N2, D1 * D2) = 0);
|
|
mpq_clear(product);
|
|
mpq_clear(multiplier);
|
|
mpq_clear(multiplicant);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_mul_2exp_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 3;
|
|
OP_2 = 2;
|
|
var rop, op1: mpq_t;
|
|
begin
|
|
mpq_init(rop);
|
|
mpq_init(op1);
|
|
mpq_set_si(op1, N1, D1);
|
|
mpq_mul_2exp(rop, op1, OP_2);
|
|
assert(mpq_cmp_si(rop, N1 * (1 shl OP_2), D1) = 0);
|
|
mpq_clear(rop);
|
|
mpq_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_div_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var quotient, dividend, divisor: mpq_t;
|
|
begin
|
|
mpq_init(quotient);
|
|
mpq_init(dividend);
|
|
mpq_init(divisor);
|
|
mpq_set_si(dividend, N1, D1);
|
|
mpq_set_si(divisor, N2, D2);
|
|
mpq_div(quotient, dividend, divisor);
|
|
assert(mpq_cmp_si(quotient, -N1 * D2, -D1 * N2) = 0);
|
|
mpq_clear(quotient);
|
|
mpq_clear(dividend);
|
|
mpq_clear(divisor);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_div_2exp_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 3;
|
|
OP_2 = 2;
|
|
var rop, op1: mpq_t;
|
|
begin
|
|
mpq_init(rop);
|
|
mpq_init(op1);
|
|
mpq_set_si(op1, N1, D1);
|
|
mpq_div_2exp(rop, op1, OP_2);
|
|
assert(mpq_cmp_si(rop, N1, D1 * (1 shl OP_2)) = 0);
|
|
mpq_clear(rop);
|
|
mpq_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_neg_test;
|
|
const
|
|
N1 = -5;
|
|
D1 = 3;
|
|
var negated_operand, operand: mpq_t;
|
|
begin
|
|
mpq_init(negated_operand);
|
|
mpq_init(operand);
|
|
mpq_set_si(operand, N1, D1);
|
|
mpq_neg(negated_operand, operand);
|
|
assert(mpq_cmp_si(negated_operand, -N1, D1) = 0);
|
|
mpq_clear(negated_operand);
|
|
mpq_clear(operand);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_abs_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 3;
|
|
var rop, op: mpq_t;
|
|
begin
|
|
mpq_init(rop);
|
|
mpq_init(op);
|
|
mpq_set_si(op, -N1, D1);
|
|
mpq_abs(rop, op);
|
|
assert(mpq_cmp_si(rop, N1, D1) = 0);
|
|
mpq_clear(rop);
|
|
mpq_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_inv_test;
|
|
const
|
|
N1 = -5;
|
|
D1 = 3;
|
|
var inverted_number, number: mpq_t;
|
|
begin
|
|
mpq_init(inverted_number);
|
|
mpq_init(number);
|
|
mpq_set_si(number, N1, D1);
|
|
mpq_inv(inverted_number, number);
|
|
assert(mpq_cmp_si(inverted_number, -D1, -N1) = 0);
|
|
mpq_clear(inverted_number);
|
|
mpq_clear(number);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_cmp_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
var op1, op2: mpq_t;
|
|
begin
|
|
mpq_init(op1);
|
|
mpq_init(op2);
|
|
mpq_set_si(op1, N1, D1);
|
|
mpq_set_si(op2, N1, D1);
|
|
assert(mpq_cmp(op1, op2) = 0);
|
|
mpq_set_si(op1, N1 + 1, D1);
|
|
assert(mpq_cmp(op1, op2) > 0);
|
|
mpq_set_si(op1, N1 - 1, D1);
|
|
assert(mpq_cmp(op1, op2) < 0);
|
|
mpq_clear(op1);
|
|
mpq_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_cmp_si_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
var op1: mpq_t;
|
|
begin
|
|
mpq_init(op1);
|
|
mpq_set_si(op1, N1, D1);
|
|
assert(mpq_cmp_si(op1, N1, D1) = 0);
|
|
assert(mpq_cmp_si(op1, N1 - 1, D1) > 0);
|
|
assert(mpq_cmp_si(op1, N1 + 1, D1) < 0);
|
|
mpq_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_cmp_ui_test;
|
|
const
|
|
N1 = 7;
|
|
D1 = 5;
|
|
var op1: mpq_t;
|
|
begin
|
|
mpq_init(op1);
|
|
mpq_set_si(op1, N1, D1);
|
|
assert(mpq_cmp_ui(op1, N1, D1) = 0);
|
|
assert(mpq_cmp_ui(op1, N1 - 1, D1) > 0);
|
|
assert(mpq_cmp_ui(op1, N1 + 1, D1) < 0);
|
|
mpq_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_equal_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
var op1, op2: mpq_t;
|
|
begin
|
|
mpq_init(op1);
|
|
mpq_init(op2);
|
|
mpq_set_si(op1, N1, D1);
|
|
mpq_set_si(op2, N1, D1);
|
|
assert(longbool(mpq_equal(op1, op2)));
|
|
mpq_set_si(op1, N1 + 1, D1);
|
|
assert(not longbool(mpq_equal(op1, op2)));
|
|
mpq_set_si(op1, N1 - 1, D1);
|
|
assert(not longbool(mpq_equal(op1, op2)));
|
|
mpq_clear(op1);
|
|
mpq_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_get_num_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
var
|
|
rational: mpq_t;
|
|
numerator: mpz_t;
|
|
begin
|
|
mpq_init(rational);
|
|
mpz_init(numerator);
|
|
mpq_set_si(rational, N1, D1);
|
|
mpq_get_num(numerator, rational);
|
|
assert(mpz_get_si(numerator) = N1);
|
|
mpq_clear(rational);
|
|
mpz_clear(numerator);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_get_den_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
var
|
|
rational: mpq_t;
|
|
denominator: mpz_t;
|
|
begin
|
|
mpq_init(rational);
|
|
mpz_init(denominator);
|
|
mpq_set_si(rational, N1, D1);
|
|
mpq_get_den(denominator, rational);
|
|
assert(mpz_get_si(denominator) = D1);
|
|
mpq_clear(rational);
|
|
mpz_clear(denominator);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_set_num_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
N2 = 3;
|
|
var
|
|
rational: mpq_t;
|
|
numerator: mpz_t;
|
|
begin
|
|
mpq_init(rational);
|
|
mpz_init_set_si(numerator, N2);
|
|
mpq_set_si(rational, N1, D1);
|
|
mpq_set_num(rational, numerator);
|
|
assert(mpq_cmp_si(rational, N2, D1) = 0);
|
|
mpq_clear(rational);
|
|
mpz_clear(numerator);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpq_set_den_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
D2 = 3;
|
|
var
|
|
rational: mpq_t;
|
|
denominator: mpz_t;
|
|
begin
|
|
mpq_init(rational);
|
|
mpz_init_set_si(denominator, D2);
|
|
mpq_set_si(rational, N1, D1);
|
|
mpq_set_den(rational, denominator);
|
|
assert(mpq_cmp_si(rational, N1, D2) = 0);
|
|
mpq_clear(rational);
|
|
mpz_clear(denominator);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_get_default_prec_test;
|
|
begin
|
|
assert(mpf_get_default_prec > 0);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_set_default_prec_test;
|
|
var prec: valuint;
|
|
begin
|
|
prec := mpf_get_default_prec;
|
|
mpf_set_default_prec(2 * prec);
|
|
assert(mpf_get_default_prec = 2 * prec);
|
|
mpf_set_default_prec(prec);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_init_test;
|
|
var x: mpf_t;
|
|
begin
|
|
mpf_init(x);
|
|
assert(mpf_get_prec(x) = mpf_get_default_prec);
|
|
mpf_clear(x);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_init2_test;
|
|
var x: mpf_t;
|
|
begin
|
|
mpf_init2(x, 2 * mpf_get_default_prec);
|
|
assert(mpf_get_prec(x) = 2 * mpf_get_default_prec);
|
|
mpf_clear(x);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_clear_test;
|
|
var x: mpf_t;
|
|
begin
|
|
mpf_init(x);
|
|
mpf_clear(x);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_get_prec_test;
|
|
var x: mpf_t;
|
|
begin
|
|
mpf_init(x);
|
|
mpf_set_prec(x, 2 * mpf_get_default_prec);
|
|
assert(mpf_get_prec(x) = 2 * mpf_get_default_prec);
|
|
mpf_clear(x);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_set_prec_test;
|
|
var x: mpf_t;
|
|
begin
|
|
mpf_init(x);
|
|
mpf_set_prec(x, 2 * mpf_get_default_prec);
|
|
assert(mpf_get_prec(x) = 2 * mpf_get_default_prec);
|
|
mpf_clear(x);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_set_prec_raw_test;
|
|
const N = 10;
|
|
var x: mpf_t;
|
|
begin
|
|
mpf_init2(x, N * mpf_get_default_prec);
|
|
mpf_set_prec_raw(x, mpf_get_default_prec);
|
|
mpf_set_prec_raw(x, N * mpf_get_default_prec);
|
|
mpf_clear(x);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_set_q_test;
|
|
const OP_ = -10;
|
|
var
|
|
op: mpq_t;
|
|
rop: mpf_t;
|
|
begin
|
|
mpq_init(op);
|
|
mpf_init(rop);
|
|
mpq_set_si(op, OP_, 1);
|
|
mpf_set_q(rop, op);
|
|
assert(mpf_get_si(rop) = OP_);
|
|
mpf_clear(rop);
|
|
mpq_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_set_ui_test;
|
|
const OP = 1000000;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_set_ui(rop, OP);
|
|
assert(mpf_get_ui(rop) = OP);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_get_ui_test;
|
|
const OP = 1000000;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_set_ui(rop, OP);
|
|
assert(mpf_get_ui(rop) = OP);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_set_si_test;
|
|
const OP = -1000000;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_set_si(rop, OP);
|
|
assert(mpf_get_si(rop) = OP);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_get_si_test;
|
|
const OP = -1000000;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_set_si(rop, OP);
|
|
assert(mpf_get_si(rop) = OP);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_set_test;
|
|
const N = -1000000;
|
|
var rop, op: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_si(op, N);
|
|
mpf_set(rop, op);
|
|
assert(mpf_get_si(rop) = N);
|
|
mpf_clear(rop);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_set_str_test;
|
|
const N = -123;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
assert(mpf_set_str(rop, pchar(inttostr(N)), BASE10) = 0);
|
|
assert(mpf_get_si(rop) = N);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_swap_test;
|
|
const
|
|
ROP_1 = -13;
|
|
ROP_2 = -23;
|
|
var rop1, rop2: mpf_t;
|
|
begin
|
|
mpf_init_set_si(rop1, ROP_1);
|
|
mpf_init_set_si(rop2, ROP_2);
|
|
mpf_swap(rop1, rop2);
|
|
assert(mpf_get_si(rop1) = ROP_2);
|
|
assert(mpf_get_si(rop2) = ROP_1);
|
|
mpf_clear(rop1);
|
|
mpf_clear(rop2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_get_d_test;
|
|
const N = -1.5;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init_set_d(rop, N);
|
|
assert(mpf_get_d(rop) = N);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_set_d_test;
|
|
const N = -1.5;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_set_d(rop, N);
|
|
assert(mpf_get_d(rop) = N);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_setmpz_test;
|
|
const
|
|
OP_1 = -13;
|
|
var
|
|
rop: mpf_t;
|
|
op: mpz_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpz_init_set_si(op, OP_1);
|
|
mpf_set_z(rop, op);
|
|
assert(mpf_get_si(rop) = OP_1);
|
|
mpf_clear(rop);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_get_d_2exp_test;
|
|
const
|
|
M = 0.5;
|
|
E = 4;
|
|
N = (1 shl E) div 2;
|
|
var
|
|
rop: mpf_t;
|
|
exp: valsint;
|
|
begin
|
|
mpf_init_set_d(rop, N);
|
|
exp := -1;
|
|
assert(mpf_get_d_2exp(exp, rop) = M);
|
|
assert(exp = E);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_get_str_test;
|
|
const
|
|
N = 3.1416;
|
|
S = '31416';
|
|
E = 1;
|
|
var
|
|
op: mpf_t;
|
|
p: pchar;
|
|
exp: mp_exp_t;
|
|
begin
|
|
mpf_init_set_d(op, N);
|
|
p := mpf_get_str(nil, exp, BASE10, length(S), op);
|
|
assert(p = S);
|
|
assert(exp = E);
|
|
freemem(p);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_add_test;
|
|
const
|
|
OP1_ = 1;
|
|
OP2_ = 2;
|
|
var rop, op1, op2: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_init_set_d(op2, OP2_);
|
|
mpf_add(rop, op1, op2);
|
|
assert(mpf_get_d(rop) = OP1_ + OP2_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
mpf_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_add_ui_test;
|
|
const
|
|
OP1_ = 1;
|
|
OP2_ = 2;
|
|
var rop, op1: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_add_ui(rop, op1, OP2_);
|
|
assert(mpf_get_d(rop) = OP1_ + OP2_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_sub_test;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 1;
|
|
var rop, op1, op2: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_init_set_d(op2, OP2_);
|
|
mpf_sub(rop, op1, op2);
|
|
assert(mpf_get_d(rop) = OP1_ - OP2_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
mpf_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_sub_ui_test;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 1;
|
|
var rop, op1: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_sub_ui(rop, op1, OP2_);
|
|
assert(mpf_get_d(rop) = OP1_ - OP2_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_ui_sub_test;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 1;
|
|
var rop, op2: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op2, OP2_);
|
|
mpf_ui_sub(rop, OP1_, op2);
|
|
assert(mpf_get_d(rop) = OP1_ - OP2_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_mul_test;
|
|
const
|
|
OP1_ = 2;
|
|
OP2_ = 3;
|
|
var rop, op1, op2: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_init_set_d(op2, OP2_);
|
|
mpf_mul(rop, op1, op2);
|
|
assert(mpf_get_d(rop) = OP1_ * OP2_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
mpf_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_mul_ui_test;
|
|
const
|
|
OP1_ = 2;
|
|
OP2_ = 3;
|
|
var rop, op1: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_mul_ui(rop, op1, OP2_);
|
|
assert(mpf_get_d(rop) = OP1_ * OP2_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_mul_2exp_test;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 4;
|
|
var rop, op1: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_mul_2exp(rop, op1, OP2_);
|
|
assert(mpf_get_d(rop) = OP1_ * (1 shl OP2_));
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_div_test;
|
|
const
|
|
OP1_ = 6;
|
|
OP2_ = 2;
|
|
var rop, op1, op2: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_init_set_d(op2, OP2_);
|
|
mpf_div(rop, op1, op2);
|
|
assert(mpf_get_d(rop) = OP1_ / OP2_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
mpf_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_div_ui_test;
|
|
const
|
|
OP1_ = 6;
|
|
OP2_ = 2;
|
|
var rop, op1: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_div_ui(rop, op1, OP2_);
|
|
assert(mpf_get_d(rop) = OP1_ / OP2_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_ui_div_test;
|
|
const
|
|
OP1_ = 6;
|
|
OP2_ = 2;
|
|
var rop, op2: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_si(op2, OP2_);
|
|
mpf_ui_div(rop, OP1_, op2);
|
|
assert(mpf_get_d(rop) = OP1_ / OP2_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_div_2exp_test;
|
|
const
|
|
OP1_ = 16;
|
|
OP2_ = 2;
|
|
var rop, op1: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_div_2exp(rop, op1, OP2_);
|
|
assert(mpf_get_d(rop) = OP1_ / (1 shl OP2_));
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_sqrt_test;
|
|
const
|
|
OP_ = 4;
|
|
var rop, op: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op, OP_);
|
|
mpf_sqrt(rop, op);
|
|
assert(mpf_get_d(rop) = sqrt(OP_));
|
|
mpf_clear(rop);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_sqrt_ui_test;
|
|
const
|
|
OP_ = 4;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_sqrt_ui(rop, OP_);
|
|
assert(mpf_get_d(rop) = sqrt(OP_));
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_pow_ui_test;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 2;
|
|
var rop, op1: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_pow_ui(rop, op1, OP2_);
|
|
assert(mpf_get_d(rop) = OP1_ ** OP2_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_neg_test;
|
|
const
|
|
OP_ = 4;
|
|
var rop, op: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op, OP_);
|
|
mpf_neg(rop, op);
|
|
assert(mpf_get_d(rop) = -OP_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_abs_test;
|
|
const OP_ = -4;
|
|
var rop, op: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op, OP_);
|
|
mpf_abs(rop, op);
|
|
assert(mpf_get_d(rop) = -OP_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_cmp_test;
|
|
const OP_1 = -10;
|
|
var op1, op2: mpf_t;
|
|
begin
|
|
mpf_init_set_si(op1, OP_1);
|
|
mpf_init_set_si(op2, OP_1);
|
|
assert(mpf_cmp(op1, op2) = 0);
|
|
mpf_set_si(op2, OP_1 + 1);
|
|
assert(mpf_cmp(op1, op2) < 0);
|
|
mpf_set_si(op2, OP_1 - 1);
|
|
assert(mpf_cmp(op1, op2) > 0);
|
|
mpf_clear(op1);
|
|
mpf_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_cmp_d_test;
|
|
const OP_ = -10;
|
|
var op: mpf_t;
|
|
begin
|
|
mpf_init_set_si(op, OP_);
|
|
assert(mpf_cmp_d(op, OP_) = 0);
|
|
assert(mpf_cmp_d(op, OP_ + 1) < 0);
|
|
assert(mpf_cmp_d(op, OP_ - 1) > 0);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_cmp_si_test;
|
|
const OP_ = -10;
|
|
var op: mpf_t;
|
|
begin
|
|
mpf_init_set_si(op, OP_);
|
|
assert(mpf_cmp_si(op, OP_) = 0);
|
|
assert(mpf_cmp_si(op, OP_ + 1) < 0);
|
|
assert(mpf_cmp_si(op, OP_ - 1) > 0);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_cmp_ui_test;
|
|
const OP_ = 10;
|
|
var op: mpf_t;
|
|
begin
|
|
mpf_init_set_si(op, OP_);
|
|
assert(mpf_cmp_ui(op, OP_) = 0);
|
|
assert(mpf_cmp_ui(op, OP_ + 1) < 0);
|
|
assert(mpf_cmp_ui(op, OP_ - 1) > 0);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_eq_test;
|
|
const
|
|
OP_1 = 10;
|
|
OP_3 = 8;
|
|
var op1, op2: mpf_t;
|
|
begin
|
|
mpf_init_set_si(op1, OP_1);
|
|
mpf_init_set_si(op2, OP_1);
|
|
assert(mpf_eq(op1, op2, OP_3) <> 0);
|
|
mpf_clear(op1);
|
|
mpf_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_reldiff_test;
|
|
const
|
|
OP1_ = 4;
|
|
OP2_ = 2;
|
|
var rop, op1, op2: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op1, OP1_);
|
|
mpf_init_set_d(op2, OP2_);
|
|
mpf_reldiff(rop, op1, op2);
|
|
assert(mpf_get_d(rop) = abs(OP1_ - OP2_) / OP1_);
|
|
mpf_clear(rop);
|
|
mpf_clear(op1);
|
|
mpf_clear(op2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_ceil_test;
|
|
const N = 3.1;
|
|
var rop, op: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op, N);
|
|
mpf_ceil(rop, op);
|
|
assert(mpf_get_d(rop) = ceil(N));
|
|
mpf_clear(rop);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_floor_test;
|
|
const N = 3.9;
|
|
var rop, op: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op, N);
|
|
mpf_floor(rop, op);
|
|
assert(mpf_get_d(rop) = floor(N));
|
|
mpf_clear(rop);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_trunc_test;
|
|
const N = -3.9;
|
|
var rop, op: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_init_set_d(op, N);
|
|
mpf_trunc(rop, op);
|
|
assert(mpf_get_d(rop) = trunc(N));
|
|
mpf_clear(rop);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_integer_p_test;
|
|
const
|
|
N1 = 10;
|
|
N2 = 10.1;
|
|
var op: mpf_t;
|
|
begin
|
|
mpf_init_set_si(op, N1);
|
|
assert(longbool(mpf_integer_p(op)));
|
|
mpf_set_d(op, N2);
|
|
assert(not longbool(mpf_integer_p(op)));
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_fits_ushort_p_test;
|
|
var op: mpf_t;
|
|
begin
|
|
mpf_init_set_ui(op, high(word));
|
|
assert(longbool(mpf_fits_ushort_p(op)));
|
|
mpf_add_ui(op, op, 1);
|
|
assert(not longbool(mpf_fits_ushort_p(op)));
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_fits_sshort_p_test;
|
|
var op: mpf_t;
|
|
begin
|
|
mpf_init_set_ui(op, high(smallint));
|
|
assert(longbool(mpf_fits_sshort_p(op)));
|
|
mpf_add_ui(op, op, 1);
|
|
assert(not longbool(mpf_fits_sshort_p(op)));
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_fits_uint_p_test;
|
|
var op: mpf_t;
|
|
begin
|
|
mpf_init_set_ui(op, high(cardinal));
|
|
assert(longbool(mpf_fits_uint_p(op)));
|
|
mpf_add_ui(op, op, 1);
|
|
assert(not longbool(mpf_fits_uint_p(op)));
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_fits_sint_p_test;
|
|
var op: mpf_t;
|
|
begin
|
|
mpf_init_set_ui(op, high(integer));
|
|
assert(longbool(mpf_fits_sint_p(op)));
|
|
mpf_add_ui(op, op, 1);
|
|
assert(not longbool(mpf_fits_sint_p(op)));
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_fits_ulong_p_test;
|
|
var op: mpf_t;
|
|
begin
|
|
mpf_init_set_ui(op, high(valuint));
|
|
assert(longbool(mpf_fits_ulong_p(op)));
|
|
mpf_add_ui(op, op, 1);
|
|
assert(not longbool(mpf_fits_ulong_p(op)));
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_fits_slong_p_test;
|
|
var op: mpf_t;
|
|
begin
|
|
mpf_init_set_ui(op, high(valsint));
|
|
assert(longbool(mpf_fits_slong_p(op)));
|
|
mpf_add_ui(op, op, 1);
|
|
assert(not longbool(mpf_fits_slong_p(op)));
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_urandomb_test;
|
|
const NBITS = 100;
|
|
var
|
|
rop: mpf_t;
|
|
state: randstate_t;
|
|
cmp: longint;
|
|
begin
|
|
mp_randinit_default(state);
|
|
mpf_init(rop);
|
|
mpf_urandomb(rop, state, NBITS);
|
|
cmp := mpf_cmp_ui(rop, 0);
|
|
assert(cmp >= 0);
|
|
assert(mpf_cmp_ui(rop, 1) < 0);
|
|
mpf_clear(rop);
|
|
mp_randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_random2_test;
|
|
var
|
|
rop: mpf_t;
|
|
begin
|
|
mpf_init(rop);
|
|
mpf_random2(rop, 1, 1);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_init_set_test;
|
|
const N = -1000000;
|
|
var rop, op: mpf_t;
|
|
begin
|
|
mpf_init_set_si(op, N);
|
|
mpf_init_set(rop, op);
|
|
assert(mpf_get_si(rop) = N);
|
|
mpf_clear(rop);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_init_set_d_test;
|
|
const N = -1.5;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init_set_d(rop, N);
|
|
assert(mpf_get_d(rop) = N);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_init_set_si_test;
|
|
const N = -5;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init_set_si(rop, N);
|
|
assert(mpf_get_si(rop) = N);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_init_set_str_test;
|
|
const N = -123;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init_set_str(rop, pchar(inttostr(N)), BASE10);
|
|
assert(mpf_get_si(rop) = N);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpf_init_set_ui_test;
|
|
const N = 5;
|
|
var rop: mpf_t;
|
|
begin
|
|
mpf_init_set_ui(rop, N);
|
|
assert(mpf_get_ui(rop) = N);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_add_n_test;
|
|
var
|
|
rop, s1, s2: mp_limb_t;
|
|
begin
|
|
s1 := high(mp_limb_t);
|
|
s2 := s1;
|
|
rop := 2;
|
|
assert(mpn_add_n(@rop, @s1, @s2, 1) = 1);
|
|
assert(rop = high(mp_limb_t) - 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_add_1_test;
|
|
var
|
|
rop, s1: mp_limb_t;
|
|
begin
|
|
s1 := high(mp_limb_t);
|
|
rop := 2;
|
|
assert(mpn_add_1(@rop, @s1, 1, high(mp_limb_t)) = 1);
|
|
assert(rop = high(mp_limb_t) - 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_add_test;
|
|
var
|
|
rop, s1, s2: mp_limb_t;
|
|
begin
|
|
s1 := high(mp_limb_t);
|
|
s2 := s1;
|
|
rop := 2;
|
|
assert(mpn_add(@rop, @s1, 1, @s2, 1) = 1);
|
|
assert(rop = high(mp_limb_t) - 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_sub_n_test;
|
|
var
|
|
rop, s1, s2: mp_limb_t;
|
|
begin
|
|
s1 := 0;
|
|
s2 := high(mp_limb_t);
|
|
rop := 2;
|
|
assert(mpn_sub_n(@rop, @s1, @s2, 1) = 1);
|
|
assert(rop = 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_sub_1_test;
|
|
var
|
|
rop, s1: mp_limb_t;
|
|
begin
|
|
s1 := 0;
|
|
rop := 2;
|
|
assert(mpn_sub_1(@rop, @s1, 1, high(mp_limb_t)) = 1);
|
|
assert(rop = 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_sub_test;
|
|
var
|
|
rop, s1, s2: mp_limb_t;
|
|
begin
|
|
s1 := 0;
|
|
s2 := high(mp_limb_t);
|
|
rop := 2;
|
|
assert(mpn_sub(@rop, @s1, 1, @s2, 1) = 1);
|
|
assert(rop = 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_mul_n_test;
|
|
var
|
|
rop: array[0..1] of mp_limb_t;
|
|
s1, s2: mp_limb_t;
|
|
begin
|
|
s1 := high(mp_limb_t);
|
|
s2 := s1;
|
|
mpn_mul_n(@rop, @s1, @s2, 1);
|
|
assert(rop[0] = 1);
|
|
assert(rop[1] = high(mp_limb_t) - 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_mul_1_test;
|
|
var
|
|
rop: array[0..1] of mp_limb_t;
|
|
s1: mp_limb_t;
|
|
begin
|
|
s1 := high(mp_limb_t);
|
|
assert(mpn_mul_1(@rop, @s1, 1, high(mp_limb_t)) = high(mp_limb_t) - 1);
|
|
assert(rop[0] = 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_mul_test;
|
|
var
|
|
rop: array[0..1] of mp_limb_t;
|
|
s1, s2: mp_limb_t;
|
|
begin
|
|
s1 := high(mp_limb_t);
|
|
s2 := s1;
|
|
assert(mpn_mul(@rop, @s1, 1, @s2, 1) = high(mp_limb_t) - 1);
|
|
assert(rop[0] = 1);
|
|
assert(rop[1] = high(mp_limb_t) - 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_addmul_1_test;
|
|
var
|
|
rop: array[0..1] of mp_limb_t;
|
|
s1: mp_limb_t;
|
|
begin
|
|
rop[0] := 1;
|
|
rop[1] := 0;
|
|
s1 := high(mp_limb_t);
|
|
assert(mpn_addmul_1(@rop, @s1, 1, high(mp_limb_t)) = high(mp_limb_t) - 1);
|
|
assert(rop[0] = 2);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_submul_1_test;
|
|
var
|
|
rop: array[0..1] of mp_limb_t;
|
|
s1: mp_limb_t;
|
|
begin
|
|
rop[0] := 1;
|
|
rop[1] := 0;
|
|
s1 := high(mp_limb_t);
|
|
assert(mpn_submul_1(@rop, @s1, 1, high(mp_limb_t)) = high(mp_limb_t) - 1);
|
|
assert(rop[0] = 0);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_tdiv_qr_test;
|
|
const
|
|
N_ = 19;
|
|
D_ = 4;
|
|
var
|
|
q, r: array[0..1] of mp_limb_t;
|
|
n, d: mp_limb_t;
|
|
begin
|
|
n := N_;
|
|
d := D_;
|
|
q[0] := 0;
|
|
q[1] := 0;
|
|
r[0] := 0;
|
|
r[1] := 0;
|
|
mpn_tdiv_qr(@q, @r, 0, @n, 1, @d, 1);
|
|
assert(q[0] = N_ div D_);
|
|
assert(r[0] = N_ mod D_);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_divrem_1_test;
|
|
const
|
|
N_ = 19;
|
|
D_ = 4;
|
|
var r1, s2: mp_limb_t;
|
|
begin
|
|
r1 := 0;
|
|
s2 := N_;
|
|
assert(mpn_divrem_1(@r1, 0, @s2, 1, D_) = N_ mod D_);
|
|
assert(r1 = N_ div D_);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_divexact_by3c_test;
|
|
const
|
|
K = 3;
|
|
N_ = 17;
|
|
var r, s: mp_limb_t;
|
|
begin
|
|
r := 0;
|
|
s := K * N_;
|
|
assert(mpn_divexact_by3c(@r, @s, 1, 0) = 0);
|
|
assert(r = N_);
|
|
s := K * N_ + 1;
|
|
assert(mpn_divexact_by3c(@r, @s, 1, 0) <> 0);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_mod_1_test;
|
|
const
|
|
N_ = 19;
|
|
D_ = 4;
|
|
var s1: mp_limb_t;
|
|
begin
|
|
s1 := N_;
|
|
assert(mpn_mod_1(@s1, 1, D_) = N_ mod D_);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_lshift_test;
|
|
var r, s: mp_limb_t;
|
|
begin
|
|
r := 0;
|
|
s := high(mp_limb_t);
|
|
assert(mpn_lshift(@r, @s, 1, 1) = 1);
|
|
assert(r = high(mp_limb_t) - 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_rshift_test;
|
|
var r, s: mp_limb_t;
|
|
begin
|
|
r := 0;
|
|
s := high(mp_limb_t);
|
|
assert(mpn_rshift(@r, @s, 1, 1) = valuint(1) shl (bits_per_limb - 1));
|
|
assert(r = high(mp_limb_t) shr 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_cmp_test;
|
|
const S1_ = 10;
|
|
var s1, s2: mp_limb_t;
|
|
begin
|
|
s1 := S1_;
|
|
S2 := S1_;
|
|
assert(mpn_cmp(@s1, @s2, 1) = 0);
|
|
S2 := S1_ - 1;
|
|
assert(mpn_cmp(@s1, @s2, 1) > 0);
|
|
S2 := S1_ + 1;
|
|
assert(mpn_cmp(@s1, @s2, 1) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_gcd_test;
|
|
const
|
|
S1_ = 30;
|
|
S2_ = 105;
|
|
RP_ = 15;
|
|
var r, s1, s2: mp_limb_t;
|
|
begin
|
|
s1 := S1_;
|
|
s2 := S2_;
|
|
r := 0;
|
|
assert(mpn_gcd(@r, @s1, 1, @s2, 1) = 1);
|
|
assert(r = RP_);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_gcd_1_test;
|
|
const
|
|
S1_ = 30;
|
|
S2_ = 105;
|
|
R_ = 15;
|
|
var s1: mp_limb_t;
|
|
begin
|
|
s1 := S1_;
|
|
assert(mpn_gcd_1(@s1, 1, S2_) = R_);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_gcdext_test;
|
|
const
|
|
S1_ = 3 * 5;
|
|
S2_ = 2 * 3;
|
|
R1_ = 3;
|
|
var
|
|
r1, r2, s1, s2: array[0..1] of mp_limb_t;
|
|
r2n: mp_size_t;
|
|
k: valsint;
|
|
begin
|
|
s1[0] := S1_;
|
|
s1[1] := 0;
|
|
s2[0] := S2_;
|
|
s2[1] := 0;
|
|
assert(mpn_gcdext(@r1, @r2, r2n, @s1, 1, @s2, 1) = 1);
|
|
assert(r2n = 1);
|
|
assert(r1[0] = R1_);
|
|
k := (valsint(r1[0]) - valsint(r2[0]) * valsint(s1[0])) div valsint(s2[0]);
|
|
assert(valsint(r1[0]) = valsint(r2[0]) * valsint(s1[0]) + k * valsint(s2[0]));
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_sqrtrem_test;
|
|
const
|
|
ROOT = 3;
|
|
var r1, r2, s: mp_limb_t;
|
|
begin
|
|
s := ROOT ** 2 + ROOT - 1;
|
|
assert(mpn_sqrtrem(@r1, @r2, @s, 1) = 1);
|
|
assert(r1 = ROOT);
|
|
assert(r2 = ROOT - 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_get_str_test;
|
|
const N = uint64($FEDCBA9876543210);
|
|
var
|
|
str: array[0..2 * sizeof(mp_limb_t)] of byte;
|
|
s1: mp_limb_t;
|
|
i: integer;
|
|
begin
|
|
s1 := N and (high(mp_limb_t) - 1);
|
|
assert(mpn_get_str(@str, BASE16, @s1, 1) = high(str));
|
|
for i := 0 to high(str) - 1 do
|
|
assert(str[i] = high(str) - i - 1);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_set_str_test;
|
|
const N = uint64($FEDCBA9876543210);
|
|
var
|
|
r: mp_limb_t;
|
|
str: array[0..2 * sizeof(mp_limb_t)] of byte;
|
|
i: integer;
|
|
begin
|
|
for i := 0 to high(str) - 1 do
|
|
str[i] := high(str) - i - 1;
|
|
assert(mpn_set_str(@r, @str, high(str), BASE16) = 1);
|
|
assert(r = N and (high(mp_limb_t) - 1));
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_scan0_test;
|
|
const
|
|
S1_ = $F75;
|
|
STARTING_BIT = 4;
|
|
N = 7;
|
|
var s1: mp_limb_t;
|
|
begin
|
|
s1 := S1_;
|
|
assert(mpn_scan0(@s1, STARTING_BIT) = N);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_scan1_test;
|
|
const
|
|
S1_ = $85;
|
|
STARTING_BIT = 4;
|
|
N = 7;
|
|
var s1: mp_limb_t;
|
|
begin
|
|
s1 := S1_;
|
|
assert(mpn_scan1(@s1, STARTING_BIT) = N);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_popcount_test;
|
|
const
|
|
S1_ = $55AA;
|
|
N = 8;
|
|
var s1: mp_limb_t;
|
|
begin
|
|
s1 := S1_;
|
|
assert(mpn_popcount(@s1, 1) = N);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_hamdist_test;
|
|
const
|
|
S1_ = $55;
|
|
S2_ = $7A;
|
|
N = 5;
|
|
var s1, s2: mp_limb_t;
|
|
begin
|
|
s1 := S1_;
|
|
s2 := S2_;
|
|
assert(mpn_hamdist(@s1, @s2, 1) = N);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_perfect_square_p_test;
|
|
const ROOT = 3;
|
|
var s1: mp_limb_t;
|
|
begin
|
|
s1 := ROOT ** 2;
|
|
assert(mpn_perfect_square_p(@s1, 1) <> 0);
|
|
s1 := s1 or 2;
|
|
assert(mpn_perfect_square_p(@s1, 1) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_random_test;
|
|
var r1: array[0..2] of mp_limb_t;
|
|
begin
|
|
mpn_random(@r1, high(r1) + 1);
|
|
assert((r1[2] <> 0) and ((r1[0] <> r1[1]) or (r1[0] <> r1[2]) or (r1[1] <> r1[2])));
|
|
end;
|
|
|
|
procedure TTestGmpBinding.mpn_random2_test;
|
|
var r1: array[0..2] of mp_limb_t;
|
|
begin
|
|
mpn_random2(@r1, high(r1) + 1);
|
|
assert((r1[2] <> 0) and ((r1[0] <> r1[1]) or (r1[0] <> r1[2]) or (r1[1] <> r1[2])));
|
|
end;
|
|
|
|
procedure TTestGmpBinding.bits_per_limb_test;
|
|
begin
|
|
assert(bits_per_limb = 8 * sizeof(mp_limb_t));
|
|
end;
|
|
|
|
procedure TTestGmpBinding.version_test;
|
|
|
|
function isvernum(s: string; first, last: integer): boolean;
|
|
var i: integer;
|
|
begin
|
|
i := strtointdef(copy(s, first, last - first + 1), -1);
|
|
result := i >= 0;
|
|
end;
|
|
|
|
const DOT = '.';
|
|
var
|
|
v: string;
|
|
dot1, dot2: integer;
|
|
begin
|
|
v := version;
|
|
dot1 := pos(DOT, v);
|
|
assert(dot1 <> 0);
|
|
dot2 := posex(DOT, v, dot1 + 1);
|
|
assert(dot2 <> 0);
|
|
assert(isvernum(v, 1, dot1 - 1));
|
|
assert(isvernum(v, dot1 + 1, dot2 - 1));
|
|
assert(isvernum(v, dot2 + 1, length(v)));
|
|
end;
|
|
|
|
{ TTestGmpExtensions }
|
|
|
|
procedure TTestGmpExtensions.randinit_default_test;
|
|
var state: MPRandState;
|
|
begin
|
|
randinit_default(state);
|
|
assert(rnd_test(state.Ptr^));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.randinit_mt_test;
|
|
var state: MPRandState;
|
|
begin
|
|
randinit_mt(state);
|
|
assert(rnd_test(state.Ptr^));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.randinit_lc_2exp_test;
|
|
const
|
|
A_ = 3;
|
|
C = 5;
|
|
M2EXP = 8;
|
|
var
|
|
state: MPRandState;
|
|
a: MPInteger;
|
|
begin
|
|
z_init_set_ui(a, A_);
|
|
randinit_lc_2exp(state, a, C, M2EXP);
|
|
assert(rnd_test(state.Ptr^));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.randinit_lc_2exp_size_test;
|
|
var state: MPRandState;
|
|
begin
|
|
assert(randinit_lc_2exp_size(state, 0));
|
|
assert(rnd_test(state.Ptr^));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.randinit_set_test;
|
|
var rop, op: MPRandState;
|
|
begin
|
|
randinit_default(op);
|
|
randinit_set(rop, op);
|
|
assert(rnd_test(rop.Ptr^));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.randclear_test;
|
|
var state: MPRandState;
|
|
begin
|
|
randinit_default(state);
|
|
randclear(state);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.randseed_test;
|
|
var
|
|
state: MPRandState;
|
|
seed: MPInteger;
|
|
begin
|
|
randinit_default(state);
|
|
z_init_set_ui(seed, 0);
|
|
randseed(state, seed);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.randseed_ui_test;
|
|
var state: MPRandState;
|
|
begin
|
|
randinit_default(state);
|
|
randseed_ui(state, 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.urandomb_ui_test;
|
|
const
|
|
B = 8 * (sizeof(valuint) - 1);
|
|
N = 1 shl B;
|
|
var
|
|
state: MPRandState;
|
|
r1, r2, r3: valuint;
|
|
begin
|
|
randinit_default(state);
|
|
r1 := urandomb_ui(state, B);
|
|
r2 := urandomb_ui(state, B);
|
|
r3 := urandomb_ui(state, B);
|
|
assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.urandomm_ui_test;
|
|
const N = high(valuint);
|
|
var
|
|
state: MPRandState;
|
|
r1, r2, r3: valuint;
|
|
begin
|
|
randinit_default(state);
|
|
r1 := urandomm_ui(state, N);
|
|
r2 := urandomm_ui(state, N);
|
|
r3 := urandomm_ui(state, N);
|
|
assert((r1 < N) and (r2 < N) and (r3 < N) and ((r1 <> r2) or (r1 <> r3) or (r2 <> r3)));
|
|
end;
|
|
|
|
//procedure TTestGmpExtensions.asprintf_test;
|
|
//const
|
|
// N = 123456;
|
|
// S = '123456';
|
|
//var
|
|
// z: MPInteger;
|
|
// p: pchar;
|
|
//begin
|
|
// z_init_set_ui(z, N);
|
|
// assert(asprintf(p, Z_FMT, [@z]) = length(S));
|
|
// assert(p = S);
|
|
// freemem(p);
|
|
// z_clear(z);
|
|
//end;
|
|
//
|
|
//procedure TTestGmpExtensions.asprintf_test2;
|
|
//const
|
|
// N = 123456;
|
|
// S = '123456';
|
|
//var
|
|
// z: MPInteger;
|
|
// p: pchar;
|
|
//begin
|
|
// z_init_set_ui(z, N);
|
|
// assert(asprintf(p, Z_FMT, @z) = length(S));
|
|
// assert(p = S);
|
|
// freemem(p);
|
|
// z_clear(z);
|
|
//end;
|
|
//
|
|
//procedure TTestGmpExtensions.snprintf_test;
|
|
//const
|
|
// N = 123456;
|
|
// S = '123456';
|
|
//var
|
|
// z: MPInteger;
|
|
// buf: pchar;
|
|
//begin
|
|
// z_init_set_ui(z, N);
|
|
// getmem(buf, length(S) + 1);
|
|
// assert(snprintf(buf, length(S) + 1, Z_FMT, [@z]) = length(S));
|
|
// assert(buf = S);
|
|
// freemem(buf);
|
|
// z_clear(z);
|
|
//end;
|
|
//
|
|
//procedure TTestGmpExtensions.snprintf_test2;
|
|
//const
|
|
// N = 123456;
|
|
// S = '123456';
|
|
//var
|
|
// z: MPInteger;
|
|
// buf: pchar;
|
|
//begin
|
|
// z_init_set_ui(z, N);
|
|
// getmem(buf, length(S) + 1);
|
|
// assert(snprintf(buf, length(S) + 1, Z_FMT, @z) = length(S));
|
|
// assert(buf = S);
|
|
// freemem(buf);
|
|
// z_clear(z);
|
|
//end;
|
|
//
|
|
//procedure TTestGmpExtensions.sprintf_test;
|
|
//const
|
|
// N = 123456;
|
|
// S = '123456';
|
|
//var
|
|
// z: MPInteger;
|
|
// buf: pchar;
|
|
//begin
|
|
// z_init_set_ui(z, N);
|
|
// getmem(buf, length(S) + 1);
|
|
// assert(sprintf(buf, Z_FMT, [@z]) = length(S));
|
|
// assert(buf = S);
|
|
// freemem(buf);
|
|
// z_clear(z);
|
|
//end;
|
|
//
|
|
//procedure TTestGmpExtensions.sprintf_test2;
|
|
//const
|
|
// N = 123456;
|
|
// S = '123456';
|
|
//var
|
|
// z: MPInteger;
|
|
// buf: pchar;
|
|
//begin
|
|
// z_init_set_ui(z, N);
|
|
// getmem(buf, length(S) + 1);
|
|
// assert(sprintf(buf, Z_FMT, @z) = length(S));
|
|
// assert(buf = S);
|
|
// freemem(buf);
|
|
// z_clear(z);
|
|
//end;
|
|
//
|
|
//procedure TTestGmpExtensions.sscanf_test;
|
|
//const
|
|
// N = 3;
|
|
// D = 2;
|
|
//var q: mpq_t;
|
|
//begin
|
|
// q_init(q);
|
|
// assert(sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, [@q]) = 1);
|
|
// assert(q_cmp_ui(q, N, D) = 0);
|
|
// q_clear(q);
|
|
//end;
|
|
//
|
|
//procedure TTestGmpExtensions.sscanf_test2;
|
|
//const
|
|
// N = 3;
|
|
// D = 2;
|
|
//var q: mpq_t;
|
|
//begin
|
|
// q_init(q);
|
|
// assert(sscanf(pchar(inttostr(N) + '/' + inttostr(D)), Q_FMT, @q) = 1);
|
|
// assert(q_cmp_ui(q, N, D) = 0);
|
|
// q_clear(q);
|
|
//end;
|
|
|
|
procedure TTestGmpExtensions.z_init_test;
|
|
var integer_: MPInteger;
|
|
begin
|
|
z_init(integer_);
|
|
assert(z_get_si(integer_) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_clear_test;
|
|
const N = 1000000;
|
|
var integer_: MPInteger;
|
|
begin
|
|
z_init2(integer_, N);
|
|
z_clear(integer_);
|
|
assert(z_get_si(integer_) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_init2_test;
|
|
const N = 1000000;
|
|
var integer_: MPInteger;
|
|
begin
|
|
z_init2(integer_, N);
|
|
assert(z_get_si(integer_) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_init_set_si_test;
|
|
const N = -1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init_set_si(rop, N);
|
|
assert(z_get_si(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_init_set_ui_test;
|
|
const N = 1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init_set_ui(rop, N);
|
|
assert(z_get_ui(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_init_set_d_test;
|
|
const N = -1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init_set_d(rop, N);
|
|
assert(z_get_si(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_init_set_test;
|
|
const N = -1000000;
|
|
var rop, op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, N);
|
|
z_init_set(rop, op);
|
|
assert(z_get_si(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_init_set_str_test;
|
|
const N = 1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
assert(z_init_set_str(rop, IntToStr(N), BASE10));
|
|
assert(z_get_si(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_realloc_test;
|
|
const N = 1000;
|
|
var integer_: MPInteger;
|
|
begin
|
|
z_init(integer_);
|
|
z_realloc(integer_, N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_realloc2_test;
|
|
const N = 1000;
|
|
var integer_: MPInteger;
|
|
begin
|
|
z_init(integer_);
|
|
z_realloc2(integer_, N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_getlimbn_test;
|
|
const N = 1234;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_ui(op, N);
|
|
assert(z_getlimbn(op, 0) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_export_test;
|
|
type t = word;
|
|
const
|
|
N = 1000000;
|
|
BUF_HIGH = sizeof(N) div sizeof(t);
|
|
var
|
|
export_op, import_op: MPInteger;
|
|
buf: array[0..BUF_HIGH] of t;
|
|
count: sizeuint;
|
|
begin
|
|
z_init_set_si(export_op, N);
|
|
z_init(import_op);
|
|
z_export(buf, count, -1, sizeof(t), 0, 0, export_op);
|
|
z_import(import_op, count, -1, sizeof(t), 0, 0, buf);
|
|
assert(z_get_si(export_op) = z_get_si(import_op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_import_test;
|
|
type t = word;
|
|
const
|
|
N = 1000000;
|
|
BUF_HIGH = sizeof(N) div sizeof(t);
|
|
var
|
|
export_op, import_op: MPInteger;
|
|
buf: array[0..BUF_HIGH] of t;
|
|
count: sizeuint;
|
|
begin
|
|
z_init_set_si(export_op, N);
|
|
z_init(import_op);
|
|
z_export(buf, count, -1, sizeof(t), 0, 0, export_op);
|
|
z_import(import_op, count, -1, sizeof(t), 0, 0, buf);
|
|
assert(z_get_si(export_op) = z_get_si(import_op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_swap_test;
|
|
const
|
|
ROP_1 = -1000;
|
|
ROP_2 = 1000000;
|
|
var rop1, rop2: MPInteger;
|
|
begin
|
|
z_init_set_si(rop1, ROP_1);
|
|
z_init_set_si(rop2, ROP_2);
|
|
z_swap(rop1, rop2);
|
|
assert(z_get_si(rop1) = ROP_2);
|
|
assert(z_get_si(rop2) = ROP_1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_set_test;
|
|
const OP_ = 1000000;
|
|
var rop, op: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op, OP_);
|
|
z_set(rop, op);
|
|
assert(z_get_si(rop) = OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_set_d_test;
|
|
const OP_ = 1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_set_d(rop, OP_);
|
|
assert(z_get_si(rop) = OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_set_f_test;
|
|
const OP_ = -10;
|
|
var
|
|
op: MPFloat;
|
|
rop: MPInteger;
|
|
begin
|
|
f_init_set_si(op, OP_);
|
|
z_init(rop);
|
|
z_set_f(rop, op);
|
|
assert(z_get_si(rop) = OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_set_q_test;
|
|
const OP_ = -10;
|
|
var
|
|
op: MPRational;
|
|
rop: MPInteger;
|
|
begin
|
|
q_init(op);
|
|
z_init(rop);
|
|
q_set_si(op, OP_, 1);
|
|
z_set_q(rop, op);
|
|
assert(z_get_si(rop) = OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_set_si_test;
|
|
const OP_ = -1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_set_si(rop, OP_);
|
|
assert(z_get_si(rop) = OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_set_str_test;
|
|
const OP_ = -1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
assert(z_set_str(rop, IntToStr(OP_), BASE10));
|
|
assert(z_get_si(rop) = OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_set_ui_test;
|
|
const OP_ = 1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_set_ui(rop, OP_);
|
|
assert(z_get_si(rop) = OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_get_d_test;
|
|
const N = -1000;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, N);
|
|
assert(z_get_d(op) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_get_d_2exp_test;
|
|
const
|
|
N_LG2 = 4;
|
|
N = 1 shl N_LG2;
|
|
var
|
|
op: MPInteger;
|
|
exp: mp_exp_t;
|
|
begin
|
|
z_init_set_si(op, N);
|
|
assert(z_get_d_2exp(exp, op) = 1 / 2);
|
|
assert(exp = N_LG2 + 1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_get_si_test;
|
|
const N = -1000000;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, N);
|
|
assert(z_get_si(op) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_get_str_test;
|
|
const N = -1000000;
|
|
var
|
|
op: MPInteger;
|
|
p: pchar;
|
|
s, s0, s1: String;
|
|
begin
|
|
z_init_set_si(op, N);
|
|
s0 := inttostr(N);
|
|
s := z_get_str(BASE10, op);
|
|
assert(s = s0);
|
|
p := z_get_str(nil, BASE10, op);
|
|
assert(p = s0);
|
|
freemem(p);
|
|
setlength(s1, length(s0));
|
|
assert(pointer(z_get_str(pchar(s1), BASE10, op)) = pointer(s1));
|
|
assert(s1 = s0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_get_ui_test;
|
|
const N = 1000000;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_ui(op, N);
|
|
assert(z_get_ui(op) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_add_test;
|
|
const
|
|
OP_1 = -1000;
|
|
OP_2 = 1000000;
|
|
var rop, op1, op2, sum: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
z_add(rop, op1, op2);
|
|
assert(z_get_si(rop) = OP_1 + OP_2);
|
|
sum := z_add(op1, op2);
|
|
assert(z_get_si(sum) = OP_1 + OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_add_ui_test;
|
|
const
|
|
OP_1 = -1000;
|
|
OP_2 = 1000000;
|
|
var rop, op1, sum: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_add_ui(rop, op1, OP_2);
|
|
assert(z_get_si(rop) = OP_1 + OP_2);
|
|
sum := z_add_ui(op1, OP_2);
|
|
assert(z_get_si(sum) = OP_1 + OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_sub_test;
|
|
const
|
|
OP_1 = -1000;
|
|
OP_2 = 1000000;
|
|
var rop, op1, op2, diff: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
z_sub(rop, op1, op2);
|
|
assert(z_get_si(rop) = OP_1 - OP_2);
|
|
diff := z_sub(op1, op2);
|
|
assert(z_get_si(diff) = OP_1 - OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_sub_ui_test;
|
|
const
|
|
OP_1 = -1000;
|
|
OP_2 = 1000000;
|
|
var rop, op1, diff: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_sub_ui(rop, op1, OP_2);
|
|
assert(z_get_si(rop) = OP_1 - OP_2);
|
|
diff := z_sub_ui(op1, OP_2);
|
|
assert(z_get_si(diff) = OP_1 - OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_ui_sub_test;
|
|
const
|
|
OP_1 = 1000;
|
|
OP_2 = 1000000;
|
|
var rop, op2, diff: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op2, OP_2);
|
|
z_ui_sub(rop, OP_1, op2);
|
|
assert(z_get_si(rop) = OP_1 - OP_2);
|
|
diff := z_ui_sub(OP_1, op2);
|
|
assert(z_get_si(diff) = OP_1 - OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_mul_test;
|
|
const
|
|
OP_1 = -10;
|
|
OP_2 = 1000;
|
|
var rop, op1, op2, prod: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
z_mul(rop, op1, op2);
|
|
assert(z_get_si(rop) = OP_1 * OP_2);
|
|
prod := z_mul(op1, op2);
|
|
assert(z_get_si(prod) = OP_1 * OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_mul_si_test;
|
|
const
|
|
OP_1 = 10;
|
|
OP_2 = -1000;
|
|
var rop, op1, prod: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_mul_si(rop, op1, OP_2);
|
|
assert(z_get_si(rop) = OP_1 * OP_2);
|
|
prod := z_mul_si(op1, OP_2);
|
|
assert(z_get_si(prod) = OP_1 * OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_mul_ui_test;
|
|
const
|
|
OP_1 = -10;
|
|
OP_2 = 1000;
|
|
var rop, op1, prod: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_mul_ui(rop, op1, OP_2);
|
|
assert(z_get_si(rop) = OP_1 * OP_2);
|
|
prod := z_mul_ui(op1, OP_2);
|
|
assert(z_get_si(prod) = OP_1 * OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_addmul_test;
|
|
const
|
|
ROP_ = 10;
|
|
OP_1 = -100;
|
|
OP_2 = 1000;
|
|
var rop, op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_si(rop, ROP_);
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
z_addmul(rop, op1, op2);
|
|
assert(z_get_si(rop) = ROP_ + OP_1 * OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_addmul_ui_test;
|
|
const
|
|
ROP_ = 10;
|
|
OP_1 = -100;
|
|
OP_2 = 1000;
|
|
var rop, op1: MPInteger;
|
|
begin
|
|
z_init_set_si(rop, ROP_);
|
|
z_init_set_si(op1, OP_1);
|
|
z_addmul_ui(rop, op1, OP_2);
|
|
assert(z_get_si(rop) = ROP_ + OP_1 * OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_submul_test;
|
|
const
|
|
ROP_ = 10;
|
|
OP_1 = -100;
|
|
OP_2 = 1000;
|
|
var rop, op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_si(rop, ROP_);
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
z_submul(rop, op1, op2);
|
|
assert(z_get_si(rop) = ROP_ - OP_1 * OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_submul_ui_test;
|
|
const
|
|
ROP_ = 10;
|
|
OP_1 = -100;
|
|
OP_2 = 1000;
|
|
var rop, op1: MPInteger;
|
|
begin
|
|
z_init_set_si(rop, ROP_);
|
|
z_init_set_si(op1, OP_1);
|
|
z_submul_ui(rop, op1, OP_2);
|
|
assert(z_get_si(rop) = ROP_ - OP_1 * OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_mul_2exp_test;
|
|
const
|
|
OP_1 = 10;
|
|
OP_2 = 10;
|
|
var rop, op1, x: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_mul_2exp(rop, op1, OP_2);
|
|
assert(z_get_si(rop) = OP_1 * (1 shl OP_2));
|
|
x := z_mul_2exp(op1, OP_2);
|
|
assert(z_get_si(x) = OP_1 * (1 shl OP_2));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_neg_test;
|
|
const OP_ = 1000;
|
|
var rop, op, x: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op, OP_);
|
|
z_neg(rop, op);
|
|
assert(z_get_si(rop) = -OP_);
|
|
x := z_neg(op);
|
|
assert(z_get_si(x) = -OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_abs_test;
|
|
const OP_ = -1000;
|
|
var rop, op, x: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op, OP_);
|
|
z_abs(rop, op);
|
|
assert(z_get_si(rop) = abs(OP_));
|
|
x := z_abs(op);
|
|
assert(z_get_si(x) = abs(OP_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cdiv_q_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, n, d, q2: MPInteger;
|
|
begin
|
|
z_init(q);
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
z_cdiv_q(q, n, d);
|
|
assert(z_get_si(q) = ceil(N_ / D_));
|
|
q2 := z_cdiv_q(n, d);
|
|
assert(z_get_si(q2) = ceil(N_ / D_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fdiv_q_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, n, d, q2: MPInteger;
|
|
begin
|
|
z_init(q);
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
z_fdiv_q(q, n, d);
|
|
assert(z_get_si(q) = floor(N_ / D_));
|
|
q2 := z_fdiv_q(n, d);
|
|
assert(z_get_si(q2) = floor(N_ / D_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_tdiv_q_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, n, d, q2: MPInteger;
|
|
begin
|
|
z_init(q);
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
z_tdiv_q(q, n, d);
|
|
assert(z_get_si(q) = trunc(N_ / D_));
|
|
q2 := z_tdiv_q(n, d);
|
|
assert(z_get_si(q2) = trunc(N_ / D_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cdiv_q_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var q, n, q2: MPInteger;
|
|
begin
|
|
z_init(q);
|
|
z_init_set_si(n, N_);
|
|
z_cdiv_q_2exp(q, n, B_);
|
|
assert(z_get_si(q) = ceil(N_ / D_));
|
|
q2 := z_cdiv_q_2exp(n, B_);
|
|
assert(z_get_si(q2) = ceil(N_ / D_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fdiv_q_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var q, n, q2: MPInteger;
|
|
begin
|
|
z_init(q);
|
|
z_init_set_si(n, N_);
|
|
z_fdiv_q_2exp(q, n, B_);
|
|
assert(z_get_si(q) = floor(N_ / D_));
|
|
q2 := z_fdiv_q_2exp(n, B_);
|
|
assert(z_get_si(q2) = floor(N_ / D_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_tdiv_q_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var q, n, q2: MPInteger;
|
|
begin
|
|
z_init(q);
|
|
z_init_set_si(n, N_);
|
|
z_tdiv_q_2exp(q, n, B_);
|
|
assert(z_get_si(q) = trunc(N_ / D_));
|
|
q2 := z_tdiv_q_2exp(n, B_);
|
|
assert(z_get_si(q2) = trunc(N_ / D_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cdiv_q_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, n: MPInteger;
|
|
ur: valuint;
|
|
begin
|
|
z_init(q);
|
|
z_init_set_si(n, N_);
|
|
ur := z_cdiv_q_ui(q, n, D_);
|
|
assert(z_get_si(q) = ceil(N_ / D_));
|
|
assert(ur - abs(N_ - z_get_si(q) * D_) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fdiv_q_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, n: MPInteger;
|
|
ur: valuint;
|
|
begin
|
|
z_init(q);
|
|
z_init_set_si(n, N_);
|
|
ur := z_fdiv_q_ui(q, n, D_);
|
|
assert(z_get_si(q) = floor(N_ / D_));
|
|
assert(ur - abs(N_ - z_get_si(q) * D_) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_tdiv_q_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, n: MPInteger;
|
|
ur: valuint;
|
|
begin
|
|
z_init(q);
|
|
z_init_set_si(n, N_);
|
|
ur := z_tdiv_q_ui(q, n, D_);
|
|
assert(z_get_si(q) = trunc(N_ / D_));
|
|
assert(ur - abs(N_ - z_get_si(q) * D_) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cdiv_qr_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, r, n, d: MPInteger;
|
|
begin
|
|
z_init(q);
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
z_cdiv_qr(q, r, n, d);
|
|
assert(z_get_si(q) = ceil(N_ / D_));
|
|
assert(z_get_si(q) * D_ + z_get_si(r) = N_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fdiv_qr_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, r, n, d: MPInteger;
|
|
begin
|
|
z_init(q);
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
z_fdiv_qr(q, r, n, d);
|
|
assert(z_get_si(q) = floor(N_ / D_));
|
|
assert(z_get_si(q) * D_ + z_get_si(r) = N_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_tdiv_qr_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, r, n, d: MPInteger;
|
|
begin
|
|
z_init(q);
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
z_tdiv_qr(q, r, n, d);
|
|
assert(z_get_si(q) = trunc(N_ / D_));
|
|
assert(z_get_si(q) * D_ + z_get_si(r) = N_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cdiv_qr_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, r, n: MPInteger;
|
|
ur: valuint;
|
|
begin
|
|
z_init(q);
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
ur := z_cdiv_qr_ui(q, r, n, D_);
|
|
assert(z_get_si(q) = ceil(N_ / D_));
|
|
assert(z_get_si(q) * D_ + z_get_si(r) = N_);
|
|
assert(ur - abs(z_get_si(r)) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fdiv_qr_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, r, n: MPInteger;
|
|
ur: valuint;
|
|
begin
|
|
z_init(q);
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
ur := z_fdiv_qr_ui(q, r, n, D_);
|
|
assert(z_get_si(q) = floor(N_ / D_));
|
|
assert(z_get_si(q) * D_ + z_get_si(r) = N_);
|
|
assert(ur - abs(z_get_si(r)) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_tdiv_qr_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
q, r, n: MPInteger;
|
|
ur: valuint;
|
|
begin
|
|
z_init(q);
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
ur := z_tdiv_qr_ui(q, r, n, D_);
|
|
assert(z_get_si(q) = trunc(N_ / D_));
|
|
assert(z_get_si(q) * D_ + z_get_si(r) = N_);
|
|
assert(ur - abs(z_get_si(r)) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cdiv_r_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var r, n, d, r2: MPInteger;
|
|
begin
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
z_cdiv_r(r, n, d);
|
|
assert(ceil(N_ / D_) * D_ + z_get_si(r) = N_);
|
|
r2 := z_cdiv_r(n, d);
|
|
assert(ceil(N_ / D_) * D_ + z_get_si(r2) = N_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fdiv_r_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var r, n, d, r2: MPInteger;
|
|
begin
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
z_fdiv_r(r, n, d);
|
|
assert(floor(N_ / D_) * D_ + z_get_si(r) = N_);
|
|
r2 := z_fdiv_r(n, d);
|
|
assert(floor(N_ / D_) * D_ + z_get_si(r2) = N_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_tdiv_r_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var r, n, d, r2: MPInteger;
|
|
begin
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
z_tdiv_r(r, n, d);
|
|
assert(trunc(N_ / D_) * D_ + z_get_si(r) = N_);
|
|
r2 := z_tdiv_r(n, d);
|
|
assert(trunc(N_ / D_) * D_ + z_get_si(r2) = N_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cdiv_r_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var r, n, r2: MPInteger;
|
|
begin
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
z_cdiv_r_2exp(r, n, B_);
|
|
assert(ceil(N_ / D_) * D_ + z_get_si(r) = N_);
|
|
r2 := z_cdiv_r_2exp(n, B_);
|
|
assert(ceil(N_ / D_) * D_ + z_get_si(r2) = N_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fdiv_r_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var r, n, r2: MPInteger;
|
|
begin
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
z_fdiv_r_2exp(r, n, B_);
|
|
assert(floor(N_ / D_) * D_ + z_get_si(r) = N_);
|
|
r2 := z_fdiv_r_2exp(n, B_);
|
|
assert(floor(N_ / D_) * D_ + z_get_si(r2) = N_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_tdiv_r_2exp_test;
|
|
const
|
|
N_ = -17;
|
|
B_ = 2;
|
|
D_ = 1 shl B_;
|
|
var r, n, r2: MPInteger;
|
|
begin
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
z_tdiv_r_2exp(r, n, B_);
|
|
assert(trunc(N_ / D_) * D_ + z_get_si(r) = N_);
|
|
r2 := z_tdiv_r_2exp(n, B_);
|
|
assert(trunc(N_ / D_) * D_ + z_get_si(r2) = N_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cdiv_r_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
r, n: MPInteger;
|
|
ur: valuint;
|
|
begin
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
ur := z_cdiv_r_ui(r, n, D_);
|
|
assert(ceil(N_ / D_) * D_ + z_get_si(r) = N_);
|
|
assert(ur - abs(z_get_si(r)) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fdiv_r_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
r, n: MPInteger;
|
|
ur: valuint;
|
|
begin
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
ur := z_fdiv_r_ui(r, n, D_);
|
|
assert(floor(N_ / D_) * D_ + z_get_si(r) = N_);
|
|
assert(ur - abs(z_get_si(r)) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_tdiv_r_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var
|
|
r, n: MPInteger;
|
|
ur: valuint;
|
|
begin
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
ur := z_tdiv_r_ui(r, n, D_);
|
|
assert(trunc(N_ / D_) * D_ + z_get_si(r) = N_);
|
|
assert(ur - abs(z_get_si(r)) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cdiv_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var n: MPInteger;
|
|
begin
|
|
z_init_set_si(n, N_);
|
|
assert(z_cdiv_ui(n, D_) - abs(N_ - ceil(N_ / D_) * D_) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fdiv_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var n: MPInteger;
|
|
begin
|
|
z_init_set_si(n, N_);
|
|
assert(z_fdiv_ui(n, D_) - abs(N_ - floor(N_ / D_) * D_) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_tdiv_ui_test;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var n: MPInteger;
|
|
begin
|
|
z_init_set_si(n, N_);
|
|
assert(z_tdiv_ui(n, D_) = abs(N_ - trunc(N_ / D_) * D_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_mod_test;
|
|
const
|
|
N_ = 17;
|
|
D_ = -4;
|
|
var r, n, d, r2: MPInteger;
|
|
begin
|
|
z_init(r);
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
z_mod(r, n, d);
|
|
assert(z_get_si(r) = N_ mod abs(D_));
|
|
r2 := z_mod(n, d);
|
|
assert(z_get_si(r2) = N_ mod abs(D_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_divexact_test;
|
|
const
|
|
N_ = -16;
|
|
D_ = 4;
|
|
var q, n, d, q2: MPInteger;
|
|
begin
|
|
z_init(q);
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
z_divexact(q, n, d);
|
|
assert(z_get_si(q) * D_ = N_);
|
|
q2 := z_divexact(n, d);
|
|
assert(z_get_si(q2) * D_ = N_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_divexact_ui_test;
|
|
const
|
|
N_ = -16;
|
|
D_ = 4;
|
|
var q, n, q2: MPInteger;
|
|
begin
|
|
z_init(q);
|
|
z_init_set_si(n, N_);
|
|
z_divexact_ui(q, n, D_);
|
|
assert(z_get_si(q) * D_ = N_);
|
|
q2 := z_divexact_ui(n, D_);
|
|
assert(z_get_si(q2) * D_ = N_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_divisible_p_test;
|
|
const
|
|
N_ = -16;
|
|
D_ = 4;
|
|
var n, d: MPInteger;
|
|
begin
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
assert(z_divisible_p(n, d));
|
|
z_set_si(n, z_get_si(n) + 1);
|
|
assert(not z_divisible_p(n, d));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_divisible_ui_p_test;
|
|
const
|
|
N_ = -16;
|
|
D_ = 4;
|
|
var n: MPInteger;
|
|
begin
|
|
z_init_set_si(n, N_);
|
|
assert(z_divisible_ui_p(n, D_));
|
|
z_set_si(n, z_get_si(n) + 1);
|
|
assert(not z_divisible_ui_p(n, D_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_divisible_2exp_p_test;
|
|
const
|
|
N_ = -16;
|
|
B_ = 2;
|
|
var n: MPInteger;
|
|
begin
|
|
z_init_set_si(n, N_);
|
|
assert(z_divisible_2exp_p(n, B_));
|
|
z_set_si(n, z_get_si(n) + 1);
|
|
assert(not z_divisible_ui_p(n, B_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_congruent_p_test;
|
|
const
|
|
N_ = 23;
|
|
C_ = 6;
|
|
D_ = 17;
|
|
var n, c, d: MPInteger;
|
|
begin
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(c, C_);
|
|
z_init_set_si(d, D_);
|
|
assert(z_congruent_p(n, c, d));
|
|
z_set_si(n, z_get_si(n) + 1);
|
|
assert(not z_congruent_p(n, c, d));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_congruent_2exp_p_test;
|
|
const
|
|
N_ = 23;
|
|
C_ = 7;
|
|
B_ = 4;
|
|
var n, c: MPInteger;
|
|
begin
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(c, C_);
|
|
assert(z_congruent_2exp_p(n, c, B_));
|
|
z_set_si(n, z_get_si(n) + 1);
|
|
assert(not z_congruent_2exp_p(n, c, B_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_congruent_ui_p_test;
|
|
const
|
|
N_ = 23;
|
|
C_ = 6;
|
|
D_ = 17;
|
|
var n: MPInteger;
|
|
begin
|
|
z_init_set_si(n, N_);
|
|
assert(z_congruent_ui_p(n, C_, D_));
|
|
z_set_si(n, z_get_si(n) + 1);
|
|
assert(not z_congruent_ui_p(n, C_, D_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_powm_test;
|
|
const
|
|
N_EXP = 3;
|
|
N_MOD = 16;
|
|
ROP_ = 8;
|
|
var rop, base, exp, mod_, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(base, BASE10);
|
|
z_init_set_si(exp, N_EXP);
|
|
z_init_set_si(mod_, N_MOD);
|
|
z_powm(rop, base, exp, mod_);
|
|
assert(z_get_si(rop) = ROP_);
|
|
r2 := z_powm(base, exp, mod_);
|
|
assert(z_get_si(r2) = ROP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_powm_ui_test;
|
|
const
|
|
N_EXP = 3;
|
|
N_MOD = 16;
|
|
ROP_ = 8;
|
|
var rop, base, mod_, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(base, BASE10);
|
|
z_init_set_si(mod_, N_MOD);
|
|
z_powm_ui(rop, base, N_EXP, mod_);
|
|
assert(z_get_si(rop) = ROP_);
|
|
r2 := z_powm_ui(base, N_EXP, mod_);
|
|
assert(z_get_si(r2) = ROP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_pow_ui_test;
|
|
const
|
|
BASE_ = 10;
|
|
EXP = 3;
|
|
var rop, base, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(base, BASE_);
|
|
z_pow_ui(rop, base, EXP);
|
|
assert(z_get_si(rop) = BASE_ ** EXP);
|
|
r2 := z_pow_ui(base, EXP);
|
|
assert(z_get_si(r2) = BASE_ ** EXP);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_ui_pow_ui_test;
|
|
const
|
|
BASE_ = 10;
|
|
EXP = 3;
|
|
var rop, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_ui_pow_ui(rop, BASE_, EXP);
|
|
assert(z_get_si(rop) = BASE_ ** EXP);
|
|
r2 := z_ui_pow_ui(BASE_, EXP);
|
|
assert(z_get_si(r2) = BASE_ ** EXP);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_root_test;
|
|
const
|
|
ROOT = 5;
|
|
N_ = 3;
|
|
var rop, op: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op, ROOT ** N_);
|
|
assert(z_root(rop, op, N_));
|
|
assert(z_get_si(rop) = ROOT);
|
|
z_set_si(op, ROOT ** N_ + 1);
|
|
assert(not z_root(rop, op, N_));
|
|
assert(z_get_si(rop) = ROOT);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_rootrem_test;
|
|
const
|
|
ROOT_ = 5;
|
|
N_ = 3;
|
|
REM_ = 1;
|
|
var root, rem, u: MPInteger;
|
|
begin
|
|
assert(REM_ < ROOT_);
|
|
z_init(root);
|
|
z_init(rem);
|
|
z_init_set_si(u, ROOT_ ** N_);
|
|
z_rootrem(root, rem, u, N_);
|
|
assert(z_get_si(root) = ROOT_);
|
|
assert(z_get_si(rem) = 0);
|
|
z_set_si(u, ROOT_ ** N_ + REM_);
|
|
z_rootrem(root, rem, u, N_);
|
|
assert(z_get_si(root) = ROOT_);
|
|
assert(z_get_si(rem) = REM_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_sqrt_test;
|
|
const ROOT = 5;
|
|
var rop, op, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op, ROOT ** 2);
|
|
z_sqrt(rop, op);
|
|
assert(z_get_si(rop) = ROOT);
|
|
r2 := z_sqrt(op);
|
|
assert(z_get_si(r2) = ROOT);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_sqrtrem_test;
|
|
const
|
|
ROOT = 5;
|
|
REM = 1;
|
|
var rop1, rop2, op: MPInteger;
|
|
begin
|
|
z_init(rop1);
|
|
z_init(rop2);
|
|
z_init_set_si(op, ROOT ** 2 + REM);
|
|
z_sqrtrem(rop1, rop2, op);
|
|
assert(z_get_si(rop1) = ROOT);
|
|
assert(z_get_si(rop2) = REM);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_perfect_power_p_test;
|
|
const
|
|
ROOT = 3;
|
|
EXP = 3;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, ROOT ** EXP);
|
|
assert(z_perfect_power_p(op));
|
|
z_set_si(op, ROOT ** EXP + 1);
|
|
assert(not z_perfect_power_p(op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_perfect_square_p_test;
|
|
const ROOT = 3;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, ROOT ** 2);
|
|
assert(z_perfect_square_p(op));
|
|
z_set_si(op, ROOT ** 2 or 2);
|
|
assert(not z_perfect_square_p(op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_probab_prime_p_test;
|
|
const
|
|
N_ = 127;
|
|
REPS = 5;
|
|
var n: MPInteger;
|
|
begin
|
|
z_init_set_si(n, N_);
|
|
assert(z_probab_prime_p(n, REPS) = 2);
|
|
z_set_si(n, N_ + 1);
|
|
assert(z_probab_prime_p(n, REPS) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_nextprime_test;
|
|
const
|
|
PRIME3 = 5;
|
|
PRIME4 = 7;
|
|
var rop, op, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op, PRIME3);
|
|
z_nextprime(rop, op);
|
|
assert(z_get_si(rop) = PRIME4);
|
|
r2 := z_nextprime(op);
|
|
assert(z_get_si(r2) = PRIME4);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_gcd_test;
|
|
const
|
|
OP_1 = 42;
|
|
OP_2 = 56;
|
|
ROP_ = 14;
|
|
var rop, op1, op2, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
z_gcd(rop, op1, op2);
|
|
assert(z_get_si(rop) = ROP_);
|
|
r2 := z_gcd(op1, op2);
|
|
assert(z_get_si(r2) = ROP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_gcd_ui_test;
|
|
const
|
|
OP_1 = 42;
|
|
OP_2 = 56;
|
|
ROP_ = 14;
|
|
var rop, op1: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
assert(z_gcd_ui(rop, op1, OP_2) = ROP_);
|
|
assert(z_get_si(rop) = ROP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_gcdext_test;
|
|
const
|
|
A_ = 42;
|
|
B_ = 56;
|
|
G_ = 14;
|
|
var g, s, t, a, b: MPInteger;
|
|
begin
|
|
z_init(g);
|
|
z_init(s);
|
|
z_init(t);
|
|
z_init_set_si(a, A_);
|
|
z_init_set_si(b, B_);
|
|
z_gcdext(g, s, t, a, b);
|
|
assert(z_get_si(g) = G_);
|
|
assert(A_ * z_get_si(s) + B_ * z_get_si(t) = G_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_lcm_test;
|
|
const
|
|
OP_1 = 21;
|
|
OP_2 = 6;
|
|
ROP_ = 42;
|
|
var rop, op1, op2, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
z_lcm(rop, op1, op2);
|
|
assert(z_get_si(rop) = ROP_);
|
|
r2 := z_lcm(op1, op2);
|
|
assert(z_get_si(r2) = ROP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_lcm_ui_test;
|
|
const
|
|
OP_1 = 21;
|
|
OP_2 = 6;
|
|
ROP_ = 42;
|
|
var rop, op1, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_lcm_ui(rop, op1, OP_2);
|
|
assert(z_get_si(rop) = ROP_);
|
|
r2 := z_lcm_ui(op1, OP_2);
|
|
assert(z_get_si(r2) = ROP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_invert_test;
|
|
const
|
|
OP_1 = 256;
|
|
OP_2 = 337;
|
|
ROP_ = 104;
|
|
var rop, op1, op2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
assert(z_invert(rop, op1, op2) <> 0);
|
|
assert(z_get_si(rop) = ROP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_jacobi_test;
|
|
const
|
|
B0 = 11;
|
|
A0 = 13 * B0;
|
|
AM1 = 1001;
|
|
BM1 = 9907;
|
|
A1 = 4;
|
|
B1 = 7;
|
|
var a, b: MPInteger;
|
|
begin
|
|
z_init_set_si(a, A0);
|
|
z_init_set_si(b, B0);
|
|
assert(z_jacobi(a, b) = 0);
|
|
z_set_si(a, AM1);
|
|
z_set_si(b, BM1);
|
|
assert(z_jacobi(a, b) = -1);
|
|
z_set_si(a, A1);
|
|
z_set_si(b, B1);
|
|
assert(z_jacobi(a, b) = 1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_kronecker_si_test;
|
|
const
|
|
A_ = 8;
|
|
B0 = 6;
|
|
BM1 = 5;
|
|
B1 = 7;
|
|
var a: MPInteger;
|
|
begin
|
|
z_init_set_si(a, A_);
|
|
assert(z_kronecker_si(a, B1) = 1);
|
|
assert(z_kronecker_si(a, B0) = 0);
|
|
assert(z_kronecker_si(a, BM1) = -1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_kronecker_ui_test;
|
|
const
|
|
A_ = 8;
|
|
B0 = 6;
|
|
BM1 = 5;
|
|
B1 = 7;
|
|
var a: MPInteger;
|
|
begin
|
|
z_init_set_si(a, A_);
|
|
assert(z_kronecker_ui(a, B1) = 1);
|
|
assert(z_kronecker_ui(a, B0) = 0);
|
|
assert(z_kronecker_ui(a, BM1) = -1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_si_kronecker_test;
|
|
const
|
|
A_ = 8;
|
|
B0 = 6;
|
|
BM1 = 5;
|
|
B1 = 7;
|
|
var b: MPInteger;
|
|
begin
|
|
z_init_set_si(b, B1);
|
|
assert(z_si_kronecker(A_, b) = 1);
|
|
z_set_si(b, B0);
|
|
assert(z_si_kronecker(A_, b) = 0);
|
|
z_set_si(b, BM1);
|
|
assert(z_si_kronecker(A_, b) = -1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_ui_kronecker_test;
|
|
const
|
|
A_ = 8;
|
|
B0 = 6;
|
|
BM1 = 5;
|
|
B1 = 7;
|
|
var b: MPInteger;
|
|
begin
|
|
z_init_set_si(b, B1);
|
|
assert(z_ui_kronecker(A_, b) = 1);
|
|
z_set_si(b, B0);
|
|
assert(z_ui_kronecker(A_, b) = 0);
|
|
z_set_si(b, BM1);
|
|
assert(z_ui_kronecker(A_, b) = -1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_remove_test;
|
|
const
|
|
F_ = 5;
|
|
OP_ = 3 * F_ * 7;
|
|
ROP_ = OP_ div F_;
|
|
var rop, op, f: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op, OP_);
|
|
z_init_set_si(f, F_);
|
|
assert(z_remove(rop, op, f) = 1);
|
|
assert(z_get_si(rop) = ROP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fac_ui_test;
|
|
const
|
|
OP = 4;
|
|
ROP_ = 2 * 3 * 4;
|
|
var rop, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_fac_ui(rop, OP);
|
|
assert(z_get_si(rop) = ROP_);
|
|
r2 := z_fac_ui(OP);
|
|
assert(z_get_si(r2) = ROP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_bin_ui_test;
|
|
const
|
|
N_ = 7;
|
|
K = 3;
|
|
ROP_ = 35;
|
|
var rop, n, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(n, N_);
|
|
z_bin_ui(rop, n, K);
|
|
assert(z_get_si(rop) = ROP_);
|
|
r2 := z_bin_ui(n, K);
|
|
assert(z_get_si(r2) = ROP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_bin_uiui_test;
|
|
const
|
|
N = 7;
|
|
K = 3;
|
|
ROP_ = 35;
|
|
var rop, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_bin_uiui(rop, N, K);
|
|
assert(z_get_si(rop) = ROP_);
|
|
r2 := z_bin_uiui(N, K);
|
|
assert(z_get_si(r2) = ROP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fib_ui_test;
|
|
const
|
|
N = 10;
|
|
FN_ = 55;
|
|
var fn, ff: MPInteger;
|
|
begin
|
|
z_init(fn);
|
|
z_fib_ui(fn, N);
|
|
assert(z_get_si(fn) = FN_);
|
|
ff := z_fib_ui(N);
|
|
assert(z_get_si(ff) = FN_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fib2_ui_test;
|
|
const
|
|
N = 10;
|
|
FN_ = 55;
|
|
FNSUB1_ = 34;
|
|
var fn, fnsub1, ff, ff1: MPInteger;
|
|
begin
|
|
z_init(fn);
|
|
z_init(fnsub1);
|
|
z_fib2_ui(fn, fnsub1, N);
|
|
assert(z_get_si(fn) = FN_);
|
|
assert(z_get_si(fnsub1) = FNSUB1_);
|
|
z_init(ff1);
|
|
ff := z_fib2_ui(ff1, N);
|
|
assert(z_get_si(ff) = FN_);
|
|
assert(z_get_si(ff1) = FNSUB1_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_lucnum_ui_test;
|
|
const
|
|
N = 10;
|
|
LN_ = 123;
|
|
var ln, l2: MPInteger;
|
|
begin
|
|
z_init(ln);
|
|
z_lucnum_ui(ln, N);
|
|
assert(z_get_si(ln) = LN_);
|
|
l2 := z_lucnum_ui(N);
|
|
assert(z_get_si(l2) = LN_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_lucnum2_ui_test;
|
|
const
|
|
N = 10;
|
|
LN_ = 123;
|
|
LNSUB1_ = 76;
|
|
var ln, lnsub1, l2, l2s1: MPInteger;
|
|
begin
|
|
z_init(ln);
|
|
z_init(lnsub1);
|
|
z_lucnum2_ui(ln, lnsub1, N);
|
|
assert(z_get_si(ln) = LN_);
|
|
assert(z_get_si(lnsub1) = LNSUB1_);
|
|
z_init(l2s1);
|
|
l2 := z_lucnum2_ui(l2s1, N);
|
|
assert(z_get_si(l2) = LN_);
|
|
assert(z_get_si(l2s1) = LNSUB1_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cmp_test;
|
|
const
|
|
OP_1 = -10;
|
|
OP_2 = OP_1 - 1;
|
|
var op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
assert(z_cmp(op1, op2) > 0);
|
|
z_set_si(op2, OP_1);
|
|
assert(z_cmp(op1, op2) = 0);
|
|
z_set_si(op2, OP_1 + 1);
|
|
assert(z_cmp(op1, op2) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cmp_d_test;
|
|
const
|
|
OP_1 = -10;
|
|
var op1: MPInteger;
|
|
begin
|
|
z_init_set_si(op1, OP_1);
|
|
assert(z_cmp_d(op1, OP_1 - 1) > 0);
|
|
assert(z_cmp_d(op1, OP_1) = 0);
|
|
assert(z_cmp_d(op1, OP_1 + 1) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cmp_si_test;
|
|
const
|
|
OP_1 = -10;
|
|
var op1: MPInteger;
|
|
begin
|
|
z_init_set_si(op1, OP_1);
|
|
assert(z_cmp_si(op1, OP_1 - 1) > 0);
|
|
assert(z_cmp_si(op1, OP_1) = 0);
|
|
assert(z_cmp_si(op1, OP_1 + 1) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cmp_ui_test;
|
|
const
|
|
OP_1 = 10;
|
|
var op1: MPInteger;
|
|
begin
|
|
z_init_set_si(op1, OP_1);
|
|
assert(z_cmp_ui(op1, OP_1 - 1) > 0);
|
|
assert(z_cmp_ui(op1, OP_1) = 0);
|
|
assert(z_cmp_ui(op1, OP_1 + 1) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cmpabs_test;
|
|
const
|
|
OP_1 = -10;
|
|
OP_2 = -OP_1 - 1;
|
|
var op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, -OP_2);
|
|
assert(z_cmpabs(op1, op2) > 0);
|
|
z_set_si(op2, -OP_1);
|
|
assert(z_cmpabs(op1, op2) = 0);
|
|
z_set_si(op2, -OP_1 + 1);
|
|
assert(z_cmpabs(op1, op2) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cmpabs_d_test;
|
|
const OP_1 = -10;
|
|
var op1: MPInteger;
|
|
begin
|
|
z_init_set_si(op1, OP_1);
|
|
assert(z_cmpabs_d(op1, -OP_1 - 1) > 0);
|
|
assert(z_cmpabs_d(op1, -OP_1) = 0);
|
|
assert(z_cmpabs_d(op1, -OP_1 + 1) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_cmpabs_ui_test;
|
|
const OP_1 = -10;
|
|
var op1: MPInteger;
|
|
begin
|
|
z_init_set_si(op1, OP_1);
|
|
assert(z_cmpabs_ui(op1, -OP_1 - 1) > 0);
|
|
assert(z_cmpabs_ui(op1, -OP_1) = 0);
|
|
assert(z_cmpabs_ui(op1, -OP_1 + 1) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_and_test;
|
|
const
|
|
OP_1 = $c;
|
|
OP_2 = $a;
|
|
var rop, op1, op2, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
z_and(rop, op1, op2);
|
|
assert(z_get_si(rop) = OP_1 and OP_2);
|
|
r2 := z_and(op1, op2);
|
|
assert(z_get_si(r2) = OP_1 and OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_ior_test;
|
|
const
|
|
OP_1 = $c;
|
|
OP_2 = $a;
|
|
var rop, op1, op2, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
z_ior(rop, op1, op2);
|
|
assert(z_get_si(rop) = OP_1 or OP_2);
|
|
r2 := z_ior(op1, op2);
|
|
assert(z_get_si(r2) = OP_1 or OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_xor_test;
|
|
const
|
|
OP_1 = $c;
|
|
OP_2 = $a;
|
|
var rop, op1, op2, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
z_xor(rop, op1, op2);
|
|
assert(z_get_si(rop) = OP_1 xor OP_2);
|
|
r2 := z_xor(op1, op2);
|
|
assert(z_get_si(r2) = OP_1 xor OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_com_test;
|
|
const
|
|
OP_1 = 2;
|
|
var rop, op1, r2: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
z_init_set_si(op1, OP_1);
|
|
z_com(rop, op1);
|
|
assert(z_get_si(rop) = not OP_1 );
|
|
r2 := z_com(op1);
|
|
assert(z_get_si(r2) = not OP_1 );
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_popcount_test;
|
|
const
|
|
OP_ = $55AA;
|
|
N = 8;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, OP_);
|
|
assert(z_popcount(op) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_hamdist_test;
|
|
const
|
|
OP_1 = $55;
|
|
OP_2 = $7A;
|
|
N = 5;
|
|
var op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
assert(z_hamdist(op1, op2) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_scan0_test;
|
|
const
|
|
OP_ = $F75;
|
|
STARTING_BIT = 4;
|
|
N = 7;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, OP_);
|
|
assert(z_scan0(op, STARTING_BIT) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_scan1_test;
|
|
const
|
|
OP_ = $85;
|
|
STARTING_BIT = 4;
|
|
N = 7;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, OP_);
|
|
assert(z_scan1(op, STARTING_BIT) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_setbit_test;
|
|
const
|
|
ROP_ = $F75;
|
|
BIT_INDEX = 7;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init_set_ui(rop, ROP_);
|
|
z_setbit(rop, BIT_INDEX);
|
|
assert(z_get_ui(rop) = ROP_ or (1 shl BIT_INDEX));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_clrbit_test;
|
|
const
|
|
ROP_ = $F75;
|
|
BIT_INDEX = 9;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init_set_ui(rop, ROP_);
|
|
z_clrbit(rop, BIT_INDEX);
|
|
assert(z_get_ui(rop) = ROP_ and not (1 shl BIT_INDEX));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_combit_test;
|
|
const
|
|
ROP_ = $F75;
|
|
BIT_INDEX = 7;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init_set_ui(rop, ROP_);
|
|
z_combit(rop, BIT_INDEX);
|
|
assert(z_get_ui(rop) = ROP_ xor (1 shl BIT_INDEX));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_tstbit_test;
|
|
const
|
|
ROP_ = $F75;
|
|
BIT_INDEX1 = 7;
|
|
BIT_INDEX2 = 8;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init_set_ui(rop, ROP_);
|
|
assert(z_tstbit(rop, BIT_INDEX1) = longbool(ROP_ and (1 shl BIT_INDEX1)));
|
|
assert(z_tstbit(rop, BIT_INDEX2) = longbool(ROP_ and (1 shl BIT_INDEX2)));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_urandomb_test;
|
|
const
|
|
B = 8 * (sizeof(valuint) - 1);
|
|
N = 1 shl B;
|
|
var
|
|
rop, r2: MPInteger;
|
|
state: MPRandState;
|
|
begin
|
|
randinit_default(state);
|
|
z_init(rop);
|
|
z_urandomb(rop, state, B);
|
|
assert(z_cmp_ui(rop, N) < 0);
|
|
r2 := z_urandomb(state, B);
|
|
assert(z_cmp_ui(r2, N) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_urandomm_test;
|
|
const
|
|
N_ = 1000000;
|
|
var
|
|
rop, n, r2: MPInteger;
|
|
state: MPRandState;
|
|
begin
|
|
randinit_default(state);
|
|
z_init(rop);
|
|
z_init_set_ui(n, N_);
|
|
z_urandomm(rop, state, n);
|
|
assert(z_cmp_ui(rop, N_) < 0);
|
|
r2 := z_urandomm(state, n);
|
|
assert(z_cmp_ui(r2, N_) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_rrandomb_test;
|
|
const
|
|
B = 8 * sizeof(valuint) - 2;
|
|
N = 1 shl B;
|
|
var
|
|
rop, r2: MPInteger;
|
|
state: MPRandState;
|
|
begin
|
|
randinit_default(state);
|
|
z_init(rop);
|
|
z_rrandomb(rop, state, B);
|
|
assert(z_cmp_ui(rop, N) < 0);
|
|
r2 := z_rrandomb(state, B);
|
|
assert(z_cmp_ui(r2, N) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fits_ushort_p_test;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_ui(op, high(word));
|
|
assert(z_fits_ushort_p(op));
|
|
z_add_ui(op, op, 1);
|
|
assert(not z_fits_ushort_p(op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fits_sshort_p_test;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, high(smallint));
|
|
assert(z_fits_sshort_p(op));
|
|
z_add_ui(op, op, 1);
|
|
assert(not z_fits_sshort_p(op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fits_uint_p_test;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_ui(op, high(cardinal));
|
|
assert(z_fits_uint_p(op));
|
|
z_add_ui(op, op, 1);
|
|
assert(not z_fits_uint_p(op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fits_sint_p_test;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, high(integer));
|
|
assert(z_fits_sint_p(op));
|
|
z_add_ui(op, op, 1);
|
|
assert(not z_fits_sint_p(op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fits_ulong_p_test;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_ui(op, high(valuint));
|
|
assert(z_fits_ulong_p(op));
|
|
z_add_ui(op, op, 1);
|
|
assert(not z_fits_ulong_p(op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_fits_slong_p_test;
|
|
var op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, high(valsint));
|
|
assert(z_fits_slong_p(op));
|
|
z_add_ui(op, op, 1);
|
|
assert(not z_fits_slong_p(op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_sizeinbase_test;
|
|
const
|
|
OP_ = 1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init_set_ui(rop, OP_);
|
|
assert(z_sizeinbase(rop, BASE10) - length(inttostr(OP_)) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.z_size_test;
|
|
var rop: MPInteger;
|
|
begin
|
|
z_init(rop);
|
|
assert(z_size(rop) = 0);
|
|
z_add_ui(rop, rop, 1);
|
|
assert(z_size(rop) = 1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_init_test;
|
|
var rational: MPRational;
|
|
begin
|
|
q_init(rational);
|
|
assert(q_cmp_ui(rational, 0, 1) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_clear_test;
|
|
var rational: MPRational;
|
|
begin
|
|
q_init(rational);
|
|
q_clear(rational);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_set_ui_test;
|
|
const
|
|
OP_1 = 13;
|
|
OP_2 = 17;
|
|
var rational: MPRational;
|
|
begin
|
|
q_init(rational);
|
|
q_set_ui(rational, OP_1, OP_2);
|
|
assert(q_cmp_ui(rational, OP_1, OP_2) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_set_si_test;
|
|
const
|
|
OP_1 = -13;
|
|
OP_2 = 17;
|
|
var rational: MPRational;
|
|
begin
|
|
q_init(rational);
|
|
q_set_si(rational, OP_1, OP_2);
|
|
assert(q_cmp_si(rational, OP_1, OP_2) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_canonicalize_test;
|
|
const
|
|
OP_1 = -13;
|
|
OP_2 = 17;
|
|
CF = 11;
|
|
var rational: MPRational;
|
|
begin
|
|
q_init(rational);
|
|
q_set_si(rational, CF * OP_1, CF * OP_2);
|
|
q_canonicalize(rational);
|
|
assert(q_cmp_si(rational, OP_1, OP_2) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_set_test;
|
|
const
|
|
OP_1 = -13;
|
|
OP_2 = 17;
|
|
var rational1, rational2: MPRational;
|
|
begin
|
|
q_init(rational1);
|
|
q_init(rational2);
|
|
q_set_si(rational2, OP_1, OP_2);
|
|
q_set(rational1, rational2);
|
|
assert(q_cmp_si(rational1, OP_1, OP_2) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_set_z_test;
|
|
const
|
|
OP_1 = -13;
|
|
var
|
|
rational: MPRational;
|
|
op: MPInteger;
|
|
begin
|
|
q_init(rational);
|
|
z_init_set_si(op, OP_1);
|
|
q_set_z(rational, op);
|
|
assert(q_cmp_si(rational, OP_1, 1) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_set_str_test;
|
|
const
|
|
OP_1 = -13;
|
|
OP_2 = 17;
|
|
var rational: MPRational;
|
|
begin
|
|
q_init(rational);
|
|
assert(q_set_str(rational, pchar(inttostr(OP_1) + '/' + inttostr(OP_2)), BASE10));
|
|
assert(q_cmp_si(rational, OP_1, OP_2) = 0);
|
|
assert(not q_set_str(rational, pchar(inttostr(OP_1) + '*' + inttostr(OP_2)), BASE10));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_swap_test;
|
|
const
|
|
ROP_1N = -13;
|
|
ROP_1D = 17;
|
|
ROP_2N = -23;
|
|
ROP_2D = 31;
|
|
var rop1, rop2: MPRational;
|
|
begin
|
|
q_init(rop1);
|
|
q_init(rop2);
|
|
q_set_si(rop1, ROP_1N, ROP_1D);
|
|
q_set_si(rop2, ROP_2N, ROP_2D);
|
|
q_swap(rop1, rop2);
|
|
assert(q_cmp_si(rop1, ROP_2N, ROP_2D) = 0);
|
|
assert(q_cmp_si(rop2, ROP_1N, ROP_1D) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_get_d_test;
|
|
const
|
|
OP_1 = -1;
|
|
OP_2 = 2;
|
|
var op: MPRational;
|
|
begin
|
|
q_init(op);
|
|
q_set_si(op, OP_1, OP_2);
|
|
assert(q_get_d(op) = OP_1 / OP_2);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_set_d_test;
|
|
const
|
|
OP_1 = -1;
|
|
OP_2 = 2;
|
|
var rop: MPRational;
|
|
begin
|
|
q_init(rop);
|
|
q_set_d(rop, OP_1 / OP_2);
|
|
assert(q_cmp_si(rop, OP_1, OP_2) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_set_f_test;
|
|
const OP_ = -10;
|
|
var
|
|
op: MPFloat;
|
|
rop: MPRational;
|
|
begin
|
|
f_init_set_si(op, OP_);
|
|
q_init(rop);
|
|
q_set_f(rop, op);
|
|
assert(q_get_d(rop) = OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_get_str_test;
|
|
const
|
|
OP_1 = -1;
|
|
OP_2 = 2;
|
|
var
|
|
op: MPRational;
|
|
p: pchar;
|
|
s, s2: string;
|
|
begin
|
|
q_init(op);
|
|
q_set_si(op, OP_1, OP_2);
|
|
s := q_get_str(BASE10, op);
|
|
assert(s = inttostr(OP_1) + '/' + inttostr(OP_2));
|
|
p := q_get_str(nil, BASE10, op);
|
|
assert(p = inttostr(OP_1) + '/' + inttostr(OP_2));
|
|
freemem(p);
|
|
setlength(s2, length(inttostr(OP_1) + '/' + inttostr(OP_2)));
|
|
assert(pointer(q_get_str(pchar(s2), BASE10, op)) = pointer(s2));
|
|
assert(s2 = inttostr(OP_1) + '/' + inttostr(OP_2));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_add_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var sum, addend1, addend2, s2: MPRational;
|
|
begin
|
|
q_init(sum);
|
|
q_init(addend1);
|
|
q_init(addend2);
|
|
q_set_si(addend1, N1, D1);
|
|
q_set_si(addend2, N2, D2);
|
|
q_add(sum, addend1, addend2);
|
|
assert(q_cmp_si(sum, N1 * D2 + N2 * D1, D1 * D2) = 0);
|
|
s2 := q_add(addend1, addend2);
|
|
assert(q_cmp_si(s2, N1 * D2 + N2 * D1, D1 * D2) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_sub_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var difference, minuend, subtrahend, diff2: MPRational;
|
|
begin
|
|
q_init(difference);
|
|
q_init(minuend);
|
|
q_init(subtrahend);
|
|
q_set_si(minuend, N1, D1);
|
|
q_set_si(subtrahend, N2, D2);
|
|
q_sub(difference, minuend, subtrahend);
|
|
assert(q_cmp_si(difference, N1 * D2 - N2 * D1, D1 * D2) = 0);
|
|
diff2 := q_sub(minuend, subtrahend);
|
|
assert(q_cmp_si(diff2, N1 * D2 - N2 * D1, D1 * D2) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_mul_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var product, multiplier, multiplicant, p2: MPRational;
|
|
begin
|
|
q_init(product);
|
|
q_init(multiplier);
|
|
q_init(multiplicant);
|
|
q_set_si(multiplier, N1, D1);
|
|
q_set_si(multiplicant, N2, D2);
|
|
q_mul(product, multiplier, multiplicant);
|
|
assert(q_cmp_si(product, N1 * N2, D1 * D2) = 0);
|
|
p2 := q_mul(multiplier, multiplicant);
|
|
assert(q_cmp_si(p2, N1 * N2, D1 * D2) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_mul_2exp_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 3;
|
|
OP_2 = 2;
|
|
var rop, op1, r2: MPRational;
|
|
begin
|
|
q_init(rop);
|
|
q_init(op1);
|
|
q_set_si(op1, N1, D1);
|
|
q_mul_2exp(rop, op1, OP_2);
|
|
assert(q_cmp_si(rop, N1 * (1 shl OP_2), D1) = 0);
|
|
r2 := q_mul_2exp(op1, OP_2);
|
|
assert(q_cmp_si(r2, N1 * (1 shl OP_2), D1) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_div_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var quotient, dividend, divisor, q2: MPRational;
|
|
begin
|
|
q_init(quotient);
|
|
q_init(dividend);
|
|
q_init(divisor);
|
|
q_set_si(dividend, N1, D1);
|
|
q_set_si(divisor, N2, D2);
|
|
q_div(quotient, dividend, divisor);
|
|
assert(q_cmp_si(quotient, -N1 * D2, -D1 * N2) = 0);
|
|
q2 := q_div(dividend, divisor);
|
|
assert(q_cmp_si(q2, -N1 * D2, -D1 * N2) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_div_2exp_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 3;
|
|
OP_2 = 2;
|
|
var rop, op1, r2: MPRational;
|
|
begin
|
|
q_init(rop);
|
|
q_init(op1);
|
|
q_set_si(op1, N1, D1);
|
|
q_div_2exp(rop, op1, OP_2);
|
|
assert(q_cmp_si(rop, N1, D1 * (1 shl OP_2)) = 0);
|
|
r2 := q_div_2exp(op1, OP_2);
|
|
assert(q_cmp_si(r2, N1, D1 * (1 shl OP_2)) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_neg_test;
|
|
const
|
|
N1 = -5;
|
|
D1 = 3;
|
|
var negated_operand, operand, n2: MPRational;
|
|
begin
|
|
q_init(negated_operand);
|
|
q_init(operand);
|
|
q_set_si(operand, N1, D1);
|
|
q_neg(negated_operand, operand);
|
|
assert(q_cmp_si(negated_operand, -N1, D1) = 0);
|
|
n2 := q_neg(operand);
|
|
assert(q_cmp_si(n2, -N1, D1) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_abs_test;
|
|
const
|
|
N1 = 5;
|
|
D1 = 3;
|
|
var rop, op, r2: MPRational;
|
|
begin
|
|
q_init(rop);
|
|
q_init(op);
|
|
q_set_si(op, -N1, D1);
|
|
q_abs(rop, op);
|
|
assert(q_cmp_si(rop, N1, D1) = 0);
|
|
r2 := q_abs(op);
|
|
assert(q_cmp_si(r2, N1, D1) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_inv_test;
|
|
const
|
|
N1 = -5;
|
|
D1 = 3;
|
|
var inverted_number, number, i2: MPRational;
|
|
begin
|
|
q_init(inverted_number);
|
|
q_init(number);
|
|
q_set_si(number, N1, D1);
|
|
q_inv(inverted_number, number);
|
|
assert(q_cmp_si(inverted_number, -D1, -N1) = 0);
|
|
i2 := q_inv(number);
|
|
assert(q_cmp_si(i2, -D1, -N1) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_cmp_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
var op1, op2: MPRational;
|
|
begin
|
|
q_init(op1);
|
|
q_init(op2);
|
|
q_set_si(op1, N1, D1);
|
|
q_set_si(op2, N1, D1);
|
|
assert(q_cmp(op1, op2) = 0);
|
|
q_set_si(op1, N1 + 1, D1);
|
|
assert(q_cmp(op1, op2) > 0);
|
|
q_set_si(op1, N1 - 1, D1);
|
|
assert(q_cmp(op1, op2) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_cmp_si_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
var op1: MPRational;
|
|
begin
|
|
q_init(op1);
|
|
q_set_si(op1, N1, D1);
|
|
assert(q_cmp_si(op1, N1, D1) = 0);
|
|
assert(q_cmp_si(op1, N1 - 1, D1) > 0);
|
|
assert(q_cmp_si(op1, N1 + 1, D1) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_cmp_ui_test;
|
|
const
|
|
N1 = 7;
|
|
D1 = 5;
|
|
var op1: MPRational;
|
|
begin
|
|
q_init(op1);
|
|
q_set_si(op1, N1, D1);
|
|
assert(q_cmp_ui(op1, N1, D1) = 0);
|
|
assert(q_cmp_ui(op1, N1 - 1, D1) > 0);
|
|
assert(q_cmp_ui(op1, N1 + 1, D1) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_equal_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
var op1, op2: MPRational;
|
|
begin
|
|
q_init(op1);
|
|
q_init(op2);
|
|
q_set_si(op1, N1, D1);
|
|
q_set_si(op2, N1, D1);
|
|
assert(q_equal(op1, op2));
|
|
q_set_si(op1, N1 + 1, D1);
|
|
assert(not q_equal(op1, op2));
|
|
q_set_si(op1, N1 - 1, D1);
|
|
assert(not q_equal(op1, op2));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_get_num_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
var
|
|
rational: MPRational;
|
|
numerator, n2: MPInteger;
|
|
begin
|
|
q_init(rational);
|
|
z_init(numerator);
|
|
q_set_si(rational, N1, D1);
|
|
q_get_num(numerator, rational);
|
|
assert(z_get_si(numerator) = N1);
|
|
n2 := q_get_num(rational);
|
|
assert(z_get_si(n2) = N1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_get_den_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
var
|
|
rational: MPRational;
|
|
denominator, d2: MPInteger;
|
|
begin
|
|
q_init(rational);
|
|
z_init(denominator);
|
|
q_set_si(rational, N1, D1);
|
|
q_get_den(denominator, rational);
|
|
assert(z_get_si(denominator) = D1);
|
|
d2 := q_get_den(rational);
|
|
assert(z_get_si(d2) = D1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_set_num_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
N2 = 3;
|
|
var
|
|
rational: MPRational;
|
|
numerator: MPInteger;
|
|
begin
|
|
q_init(rational);
|
|
z_init_set_si(numerator, N2);
|
|
q_set_si(rational, N1, D1);
|
|
q_set_num(rational, numerator);
|
|
assert(q_cmp_si(rational, N2, D1) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.q_set_den_test;
|
|
const
|
|
N1 = -7;
|
|
D1 = 5;
|
|
D2 = 3;
|
|
var
|
|
rational: MPRational;
|
|
denominator: MPInteger;
|
|
begin
|
|
q_init(rational);
|
|
z_init_set_si(denominator, D2);
|
|
q_set_si(rational, N1, D1);
|
|
q_set_den(rational, denominator);
|
|
assert(q_cmp_si(rational, N1, D2) = 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_get_default_prec_test;
|
|
begin
|
|
assert(f_get_default_prec > 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_set_default_prec_test;
|
|
var prec: valuint;
|
|
begin
|
|
prec := f_get_default_prec;
|
|
f_set_default_prec(2 * prec);
|
|
assert(f_get_default_prec = 2 * prec);
|
|
f_set_default_prec(prec);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_init_test;
|
|
var x: MPFloat;
|
|
begin
|
|
f_init(x);
|
|
assert(f_get_prec(x) = f_get_default_prec);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_init2_test;
|
|
var x: MPFloat;
|
|
begin
|
|
f_init2(x, 2 * f_get_default_prec);
|
|
assert(f_get_prec(x) = 2 * f_get_default_prec);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_clear_test;
|
|
var x: MPFloat;
|
|
begin
|
|
f_init(x);
|
|
f_clear(x);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_get_prec_test;
|
|
var x: MPFloat;
|
|
begin
|
|
f_init(x);
|
|
f_set_prec(x, 2 * f_get_default_prec);
|
|
assert(f_get_prec(x) = 2 * f_get_default_prec);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_set_prec_test;
|
|
var x: MPFloat;
|
|
begin
|
|
f_init(x);
|
|
f_set_prec(x, 2 * f_get_default_prec);
|
|
assert(f_get_prec(x) = 2 * f_get_default_prec);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_set_prec_raw_test;
|
|
const N = 10;
|
|
var x: MPFloat;
|
|
begin
|
|
f_init2(x, N * f_get_default_prec);
|
|
f_set_prec_raw(x, f_get_default_prec);
|
|
f_set_prec_raw(x, N * f_get_default_prec);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_set_q_test;
|
|
const OP_ = -10;
|
|
var
|
|
op: MPRational;
|
|
rop: MPFloat;
|
|
begin
|
|
q_init(op);
|
|
f_init(rop);
|
|
q_set_si(op, OP_, 1);
|
|
f_set_q(rop, op);
|
|
assert(f_get_si(rop) = OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_set_ui_test;
|
|
const OP = 1000000;
|
|
var rop: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_set_ui(rop, OP);
|
|
assert(f_get_ui(rop) = OP);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_get_ui_test;
|
|
const OP = 1000000;
|
|
var rop: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_set_ui(rop, OP);
|
|
assert(f_get_ui(rop) = OP);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_set_si_test;
|
|
const OP = -1000000;
|
|
var rop: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_set_si(rop, OP);
|
|
assert(f_get_si(rop) = OP);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_get_si_test;
|
|
const OP = -1000000;
|
|
var rop: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_set_si(rop, OP);
|
|
assert(f_get_si(rop) = OP);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_set_test;
|
|
const N = -1000000;
|
|
var rop, op: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_si(op, N);
|
|
f_set(rop, op);
|
|
assert(f_get_si(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_set_str_test;
|
|
const N = -123;
|
|
var rop: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
assert(f_set_str(rop, inttostr(N), BASE10));
|
|
assert(f_get_si(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_swap_test;
|
|
const
|
|
ROP_1 = -13;
|
|
ROP_2 = -23;
|
|
var rop1, rop2: MPFloat;
|
|
begin
|
|
f_init_set_si(rop1, ROP_1);
|
|
f_init_set_si(rop2, ROP_2);
|
|
f_swap(rop1, rop2);
|
|
assert(f_get_si(rop1) = ROP_2);
|
|
assert(f_get_si(rop2) = ROP_1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_get_d_test;
|
|
const N = -1.5;
|
|
var rop: MPFloat;
|
|
begin
|
|
f_init_set_d(rop, N);
|
|
assert(f_get_d(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_set_d_test;
|
|
const N = -1.5;
|
|
var rop: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_set_d(rop, N);
|
|
assert(f_get_d(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_set_z_test;
|
|
const
|
|
OP_1 = -13;
|
|
var
|
|
rop: MPFloat;
|
|
op: MPInteger;
|
|
begin
|
|
f_init(rop);
|
|
z_init_set_si(op, OP_1);
|
|
f_set_z(rop, op);
|
|
assert(f_get_si(rop) = OP_1);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_get_d_2exp_test;
|
|
const
|
|
M = 0.5;
|
|
E = 4;
|
|
N = (1 shl E) div 2;
|
|
var
|
|
rop: MPFloat;
|
|
exp: valsint;
|
|
begin
|
|
f_init_set_d(rop, N);
|
|
exp := -1;
|
|
assert(f_get_d_2exp(exp, rop) = M);
|
|
assert(exp = E);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_get_str_test;
|
|
const
|
|
N = 3.1416;
|
|
S = '31416';
|
|
E = 1;
|
|
var
|
|
op: MPFloat;
|
|
p: pchar;
|
|
exp: mp_exp_t;
|
|
s1: string;
|
|
begin
|
|
f_init_set_d(op, N);
|
|
p := f_get_str(nil, exp, BASE10, length(S), op);
|
|
assert(p = S);
|
|
assert(exp = E);
|
|
freemem(p);
|
|
setlength(s1, length(S));
|
|
assert(pointer(f_get_str(pchar(s1), exp, BASE10, length(s), op)) = pointer(s1));
|
|
assert(s1 = S);
|
|
s1 := f_get_str(exp, BASE10, length(S), op);
|
|
assert(s1 = S);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_add_test;
|
|
const
|
|
OP1_ = 1;
|
|
OP2_ = 2;
|
|
var rop, op1, op2, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
f_add(rop, op1, op2);
|
|
assert(f_get_d(rop) = OP1_ + OP2_);
|
|
r2 := f_add(op1, op2);
|
|
assert(f_get_d(r2) = OP1_ + OP2_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_add_ui_test;
|
|
const
|
|
OP1_ = 1;
|
|
OP2_ = 2;
|
|
var rop, op1, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_add_ui(rop, op1, OP2_);
|
|
assert(f_get_d(rop) = OP1_ + OP2_);
|
|
r2 := f_add_ui(op1, OP2_);
|
|
assert(f_get_d(r2) = OP1_ + OP2_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_sub_test;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 1;
|
|
var rop, op1, op2, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
f_sub(rop, op1, op2);
|
|
assert(f_get_d(rop) = OP1_ - OP2_);
|
|
r2 := f_sub(op1, op2);
|
|
assert(f_get_d(r2) = OP1_ - OP2_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_sub_ui_test;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 1;
|
|
var rop, op1, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_sub_ui(rop, op1, OP2_);
|
|
assert(f_get_d(rop) = OP1_ - OP2_);
|
|
r2 := f_sub_ui(op1, OP2_);
|
|
assert(f_get_d(r2) = OP1_ - OP2_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_ui_sub_test;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 1;
|
|
var rop, op2, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op2, OP2_);
|
|
f_ui_sub(rop, OP1_, op2);
|
|
assert(f_get_d(rop) = OP1_ - OP2_);
|
|
r2 := f_ui_sub(OP1_, op2);
|
|
assert(f_get_d(r2) = OP1_ - OP2_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_mul_test;
|
|
const
|
|
OP1_ = 2;
|
|
OP2_ = 3;
|
|
var rop, op1, op2, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
f_mul(rop, op1, op2);
|
|
assert(f_get_d(rop) = OP1_ * OP2_);
|
|
r2 := f_mul(op1, op2);
|
|
assert(f_get_d(r2) = OP1_ * OP2_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_mul_ui_test;
|
|
const
|
|
OP1_ = 2;
|
|
OP2_ = 3;
|
|
var rop, op1, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_mul_ui(rop, op1, OP2_);
|
|
assert(f_get_d(rop) = OP1_ * OP2_);
|
|
r2 := f_mul_ui(op1, OP2_);
|
|
assert(f_get_d(r2) = OP1_ * OP2_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_mul_2exp_test;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 4;
|
|
var rop, op1, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_mul_2exp(rop, op1, OP2_);
|
|
assert(f_get_d(rop) = OP1_ * (1 shl OP2_));
|
|
r2 := f_mul_2exp(op1, OP2_);
|
|
assert(f_get_d(r2) = OP1_ * (1 shl OP2_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_div_test;
|
|
const
|
|
OP1_ = 6;
|
|
OP2_ = 2;
|
|
var rop, op1, op2, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
f_div(rop, op1, op2);
|
|
assert(f_get_d(rop) = OP1_ / OP2_);
|
|
r2 := f_div(op1, op2);
|
|
assert(f_get_d(r2) = OP1_ / OP2_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_div_ui_test;
|
|
const
|
|
OP1_ = 6;
|
|
OP2_ = 2;
|
|
var rop, op1, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_div_ui(rop, op1, OP2_);
|
|
assert(f_get_d(rop) = OP1_ / OP2_);
|
|
r2 := f_div_ui(op1, OP2_);
|
|
assert(f_get_d(r2) = OP1_ / OP2_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_ui_div_test;
|
|
const
|
|
OP1_ = 6;
|
|
OP2_ = 2;
|
|
var rop, op2, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_si(op2, OP2_);
|
|
f_ui_div(rop, OP1_, op2);
|
|
assert(f_get_d(rop) = OP1_ / OP2_);
|
|
r2 := f_ui_div(OP1_, op2);
|
|
assert(f_get_d(r2) = OP1_ / OP2_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_div_2exp_test;
|
|
const
|
|
OP1_ = 16;
|
|
OP2_ = 2;
|
|
var rop, op1, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_div_2exp(rop, op1, OP2_);
|
|
assert(f_get_d(rop) = OP1_ / (1 shl OP2_));
|
|
r2 := f_div_2exp(op1, OP2_);
|
|
assert(f_get_d(r2) = OP1_ / (1 shl OP2_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_sqrt_test;
|
|
const
|
|
OP_ = 4;
|
|
var rop, op, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op, OP_);
|
|
f_sqrt(rop, op);
|
|
assert(f_get_d(rop) = sqrt(OP_));
|
|
r2 := f_sqrt(op);
|
|
assert(f_get_d(r2) = sqrt(OP_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_sqrt_ui_test;
|
|
const
|
|
OP_ = 4;
|
|
var rop, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_sqrt_ui(rop, OP_);
|
|
assert(f_get_d(rop) = sqrt(OP_));
|
|
r2 := f_sqrt_ui(OP_);
|
|
assert(f_get_d(r2) = sqrt(OP_));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_pow_ui_test;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 2;
|
|
var rop, op1, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_pow_ui(rop, op1, OP2_);
|
|
assert(f_get_d(rop) = OP1_ ** OP2_);
|
|
r2 := f_pow_ui(op1, OP2_);
|
|
assert(f_get_d(r2) = OP1_ ** OP2_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_neg_test;
|
|
const
|
|
OP_ = 4;
|
|
var rop, op, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op, OP_);
|
|
f_neg(rop, op);
|
|
assert(f_get_d(rop) = -OP_);
|
|
r2 := f_neg(op);
|
|
assert(f_get_d(r2) = -OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_abs_test;
|
|
const OP_ = -4;
|
|
var rop, op, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op, OP_);
|
|
f_abs(rop, op);
|
|
assert(f_get_d(rop) = -OP_);
|
|
r2 := f_abs(op);
|
|
assert(f_get_d(r2) = -OP_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_cmp_test;
|
|
const OP_1 = -10;
|
|
var op1, op2: MPFloat;
|
|
begin
|
|
f_init_set_si(op1, OP_1);
|
|
f_init_set_si(op2, OP_1);
|
|
assert(f_cmp(op1, op2) = 0);
|
|
f_set_si(op2, OP_1 + 1);
|
|
assert(f_cmp(op1, op2) < 0);
|
|
f_set_si(op2, OP_1 - 1);
|
|
assert(f_cmp(op1, op2) > 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_cmp_d_test;
|
|
const OP_ = -10;
|
|
var op: MPFloat;
|
|
begin
|
|
f_init_set_si(op, OP_);
|
|
assert(f_cmp_d(op, OP_) = 0);
|
|
assert(f_cmp_d(op, OP_ + 1) < 0);
|
|
assert(f_cmp_d(op, OP_ - 1) > 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_cmp_si_test;
|
|
const OP_ = -10;
|
|
var op: MPFloat;
|
|
begin
|
|
f_init_set_si(op, OP_);
|
|
assert(f_cmp_si(op, OP_) = 0);
|
|
assert(f_cmp_si(op, OP_ + 1) < 0);
|
|
assert(f_cmp_si(op, OP_ - 1) > 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_cmp_ui_test;
|
|
const OP_ = 10;
|
|
var op: MPFloat;
|
|
begin
|
|
f_init_set_si(op, OP_);
|
|
assert(f_cmp_ui(op, OP_) = 0);
|
|
assert(f_cmp_ui(op, OP_ + 1) < 0);
|
|
assert(f_cmp_ui(op, OP_ - 1) > 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_eq_test;
|
|
const
|
|
OP_1 = 10;
|
|
OP_3 = 8;
|
|
var op1, op2: MPFloat;
|
|
begin
|
|
f_init_set_si(op1, OP_1);
|
|
f_init_set_si(op2, OP_1);
|
|
assert(f_eq(op1, op2, OP_3));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_reldiff_test;
|
|
const
|
|
OP1_ = 4;
|
|
OP2_ = 2;
|
|
var rop, op1, op2, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
f_reldiff(rop, op1, op2);
|
|
assert(f_get_d(rop) = abs(OP1_ - OP2_) / OP1_);
|
|
r2 := f_reldiff(op1, op2);
|
|
assert(f_get_d(r2) = abs(OP1_ - OP2_) / OP1_);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_ceil_test;
|
|
const N = 3.1;
|
|
var rop, op, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op, N);
|
|
f_ceil(rop, op);
|
|
assert(f_get_d(rop) = ceil(N));
|
|
r2 := f_ceil(op);
|
|
assert(f_get_d(r2) = ceil(N));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_floor_test;
|
|
const N = 3.9;
|
|
var rop, op, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op, N);
|
|
f_floor(rop, op);
|
|
assert(f_get_d(rop) = floor(N));
|
|
r2 := f_floor(op);
|
|
assert(f_get_d(r2) = floor(N));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_trunc_test;
|
|
const N = -3.9;
|
|
var rop, op, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_init_set_d(op, N);
|
|
f_trunc(rop, op);
|
|
assert(f_get_d(rop) = trunc(N));
|
|
r2 := f_trunc(op);
|
|
assert(f_get_d(r2) = trunc(N));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_integer_p_test;
|
|
const
|
|
N1 = 10;
|
|
N2 = 10.1;
|
|
var op: MPFloat;
|
|
begin
|
|
f_init_set_si(op, N1);
|
|
assert(f_integer_p(op));
|
|
f_set_d(op, N2);
|
|
assert(not f_integer_p(op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_fits_ushort_p_test;
|
|
var op: MPFloat;
|
|
begin
|
|
f_init_set_ui(op, high(word));
|
|
assert(f_fits_ushort_p(op));
|
|
f_add_ui(op, op, 1);
|
|
assert(not f_fits_ushort_p(op));
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_fits_sshort_p_test;
|
|
var op: MPFloat;
|
|
begin
|
|
f_init_set_ui(op, high(smallint));
|
|
assert(f_fits_sshort_p(op));
|
|
f_add_ui(op, op, 1);
|
|
assert(not f_fits_sshort_p(op));
|
|
f_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_fits_uint_p_test;
|
|
var op: MPFloat;
|
|
begin
|
|
f_init_set_ui(op, high(cardinal));
|
|
assert(f_fits_uint_p(op));
|
|
f_add_ui(op, op, 1);
|
|
assert(not f_fits_uint_p(op));
|
|
f_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_fits_sint_p_test;
|
|
var op: MPFloat;
|
|
begin
|
|
f_init_set_ui(op, high(integer));
|
|
assert(f_fits_sint_p(op));
|
|
f_add_ui(op, op, 1);
|
|
assert(not f_fits_sint_p(op));
|
|
f_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_fits_ulong_p_test;
|
|
var op: MPFloat;
|
|
begin
|
|
f_init_set_ui(op, high(valuint));
|
|
assert(f_fits_ulong_p(op));
|
|
f_add_ui(op, op, 1);
|
|
assert(not f_fits_ulong_p(op));
|
|
f_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_fits_slong_p_test;
|
|
var op: MPFloat;
|
|
begin
|
|
f_init_set_ui(op, high(valsint));
|
|
assert(f_fits_slong_p(op));
|
|
f_add_ui(op, op, 1);
|
|
assert(not f_fits_slong_p(op));
|
|
f_clear(op);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_urandomb_test;
|
|
const NBITS = 100;
|
|
var
|
|
rop, r2: MPFloat;
|
|
state: MPRandState;
|
|
cmp: longint;
|
|
begin
|
|
randinit_default(state);
|
|
f_init(rop);
|
|
f_urandomb(rop, state, NBITS);
|
|
cmp := f_cmp_ui(rop, 0);
|
|
assert(cmp >= 0);
|
|
assert(f_cmp_ui(rop, 1) < 0);
|
|
r2 := f_urandomb(state, NBITS);
|
|
cmp := f_cmp_ui(r2, 0);
|
|
assert(cmp >= 0);
|
|
assert(f_cmp_ui(r2, 1) < 0);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_random2_test;
|
|
var
|
|
rop, r2: MPFloat;
|
|
begin
|
|
f_init(rop);
|
|
f_random2(rop, 1, 1);
|
|
r2 := f_random2(1, 1);
|
|
assert(assigned(r2))
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_init_set_test;
|
|
const N = -1000000;
|
|
var rop, op: MPFloat;
|
|
begin
|
|
f_init_set_si(op, N);
|
|
f_init_set(rop, op);
|
|
assert(f_get_si(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_init_set_d_test;
|
|
const N = -1.5;
|
|
var rop: MPFloat;
|
|
begin
|
|
f_init_set_d(rop, N);
|
|
assert(f_get_d(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_init_set_si_test;
|
|
const N = -5;
|
|
var rop: MPFloat;
|
|
begin
|
|
f_init_set_si(rop, N);
|
|
assert(f_get_si(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_init_set_str_test;
|
|
const N = -123;
|
|
var rop: MPFloat;
|
|
begin
|
|
f_init_set_str(rop, inttostr(N), BASE10);
|
|
assert(f_get_si(rop) = N);
|
|
end;
|
|
|
|
procedure TTestGmpExtensions.f_init_set_ui_test;
|
|
const N = 5;
|
|
var rop: MPFloat;
|
|
begin
|
|
f_init_set_ui(rop, N);
|
|
assert(f_get_ui(rop) = N);
|
|
end;
|
|
|
|
{ TTestGmpOperators }
|
|
|
|
// operator * (op1: MPFloat; op2: MPFloat): MPFloat;
|
|
procedure TTestGmpOperators.star__MPFloat__MPFloat__MPFloat_;
|
|
const
|
|
OP1_ = 2;
|
|
OP2_ = 3;
|
|
var rop, op1, op2: MPFloat;
|
|
begin
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
rop := op1 * op2;
|
|
assert(f_get_d(rop) = OP1_ * OP2_);
|
|
end;
|
|
|
|
// operator * (op1: MPInteger; op2: MPInteger): MPInteger;
|
|
procedure TTestGmpOperators.star__MPInteger__MPInteger__MPInteger_;
|
|
const
|
|
OP_1 = -10;
|
|
OP_2 = 1000;
|
|
var rop, op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
rop := op1 * op2;
|
|
assert(z_get_si(rop) = OP_1 * OP_2);
|
|
end;
|
|
|
|
// operator * (op1: MPRational; op2: MPRational): MPRational;
|
|
procedure TTestGmpOperators.star__MPRational__MPRational__MPRational_;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var product, multiplier, multiplicant: MPRational;
|
|
begin
|
|
q_init(multiplier);
|
|
q_init(multiplicant);
|
|
q_set_si(multiplier, N1, D1);
|
|
q_set_si(multiplicant, N2, D2);
|
|
product := multiplier * multiplicant;
|
|
assert(q_cmp_si(product, N1 * N2, D1 * D2) = 0);
|
|
end;
|
|
|
|
// operator ** (op1: MPFloat; op2: valuint): MPFloat;
|
|
procedure TTestGmpOperators.pow__MPFloat_valuint_MPFloat_;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 2;
|
|
var rop, op1: MPFloat;
|
|
begin
|
|
f_init_set_d(op1, OP1_);
|
|
rop := op1 ** OP2_;
|
|
assert(f_get_d(rop) = OP1_ ** OP2_);
|
|
end;
|
|
|
|
// operator ** (op1: MPInteger; op2: valuint): MPInteger;
|
|
procedure TTestGmpOperators.pow__MPInteger_valuint_MPInteger_;
|
|
const
|
|
BASE_ = 10;
|
|
EXP = 3;
|
|
var rop, base: MPInteger;
|
|
begin
|
|
z_init_set_si(base, BASE_);
|
|
rop := base ** EXP;
|
|
assert(z_get_si(rop) = BASE_ ** EXP);
|
|
end;
|
|
|
|
// operator + (op1: MPFloat; op2: MPFloat): MPFloat;
|
|
procedure TTestGmpOperators.plus__MPFloat__MPFloat__MPFloat_;
|
|
const
|
|
OP1_ = 1;
|
|
OP2_ = 2;
|
|
var rop, op1, op2: MPFloat;
|
|
begin
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
rop := op1 + op2;
|
|
assert(f_get_d(rop) = OP1_ + OP2_);
|
|
end;
|
|
|
|
// operator + (op1: MPInteger; op2: MPInteger): MPInteger;
|
|
procedure TTestGmpOperators.plus__MPInteger__MPInteger__MPInteger_;
|
|
const
|
|
OP_1 = -1000;
|
|
OP_2 = 1000000;
|
|
var rop, op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
rop := op1 + op2;
|
|
assert(z_get_si(rop) = OP_1 + OP_2);
|
|
end;
|
|
|
|
// operator + (op1: MPRational; op2: MPRational): MPRational;
|
|
procedure TTestGmpOperators.plus__MPRational__MPRational__MPRational_;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var sum, addend1, addend2: MPRational;
|
|
begin
|
|
q_init(addend1);
|
|
q_init(addend2);
|
|
q_set_si(addend1, N1, D1);
|
|
q_set_si(addend2, N2, D2);
|
|
sum := addend1 + addend2;
|
|
assert(q_cmp_si(sum, N1 * D2 + N2 * D1, D1 * D2) = 0);
|
|
end;
|
|
|
|
// operator - (op: MPFloat): MPFloat;
|
|
procedure TTestGmpOperators.minus__MPFloat__MPFloat_;
|
|
const
|
|
OP_ = 4;
|
|
var rop, op: MPFloat;
|
|
begin
|
|
f_init_set_d(op, OP_);
|
|
rop := -op;
|
|
assert(f_get_d(rop) = -OP_);
|
|
end;
|
|
|
|
// operator - (op: MPInteger): MPInteger;
|
|
procedure TTestGmpOperators.minus__MPInteger__MPInteger_;
|
|
const OP_ = 1000;
|
|
var rop, op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, OP_);
|
|
rop := -op;
|
|
assert(z_get_si(rop) = -OP_);
|
|
end;
|
|
|
|
// operator - (op: MPRational): MPRational;
|
|
procedure TTestGmpOperators.minus__MPRational__MPRational_;
|
|
const
|
|
N1 = -5;
|
|
D1 = 3;
|
|
var negated_operand, operand: MPRational;
|
|
begin
|
|
q_init(negated_operand);
|
|
q_init(operand);
|
|
q_set_si(operand, N1, D1);
|
|
negated_operand := - operand;
|
|
assert(q_cmp_si(negated_operand, -N1, D1) = 0);
|
|
end;
|
|
|
|
// operator - (op1: MPFloat; op2: MPFloat): MPFloat;
|
|
procedure TTestGmpOperators.minus__MPFloat__MPFloat__MPFloat_;
|
|
const
|
|
OP1_ = 3;
|
|
OP2_ = 1;
|
|
var rop, op1, op2: MPFloat;
|
|
begin
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
rop := op1 - op2;
|
|
assert(f_get_d(rop) = OP1_ - OP2_);
|
|
end;
|
|
|
|
// operator - (op1: MPInteger; op2: MPInteger): MPInteger;
|
|
procedure TTestGmpOperators.minus__MPInteger__MPInteger__MPInteger_;
|
|
const
|
|
OP_1 = -1000;
|
|
OP_2 = 1000000;
|
|
var rop, op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_si(op1, OP_1);
|
|
z_init_set_si(op2, OP_2);
|
|
rop := op1 - op2;
|
|
assert(z_get_si(rop) = OP_1 - OP_2);
|
|
end;
|
|
|
|
// operator - (op1: MPRational; op2: MPRational): MPRational;
|
|
procedure TTestGmpOperators.minus__MPRational__MPRational__MPRational_;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var difference, minuend, subtrahend: MPRational;
|
|
begin
|
|
q_init(minuend);
|
|
q_init(subtrahend);
|
|
q_set_si(minuend, N1, D1);
|
|
q_set_si(subtrahend, N2, D2);
|
|
difference := minuend - subtrahend;
|
|
assert(q_cmp_si(difference, N1 * D2 - N2 * D1, D1 * D2) = 0);
|
|
end;
|
|
|
|
// operator / (op1: MPFloat; op2: MPFloat): MPFloat;
|
|
procedure TTestGmpOperators.slash__MPFloat__MPFloat__MPFloat_;
|
|
const
|
|
OP1_ = 6;
|
|
OP2_ = 2;
|
|
var rop, op1, op2: MPFloat;
|
|
begin
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
rop := op1 / op2;
|
|
assert(f_get_d(rop) = OP1_ / OP2_);
|
|
end;
|
|
|
|
// operator / (op1: MPInteger; op2: MPInteger): MPInteger;
|
|
procedure TTestGmpOperators.slash__MPInteger__MPInteger__MPInteger_;
|
|
const
|
|
N_ = -17;
|
|
D_ = 4;
|
|
var q, n, d: MPInteger;
|
|
begin
|
|
z_init_set_si(n, N_);
|
|
z_init_set_si(d, D_);
|
|
q := n / d;
|
|
assert(z_get_si(q) = trunc(N_ / D_));
|
|
end;
|
|
|
|
// operator / (op1: MPRational; op2: MPRational): MPRational;
|
|
procedure TTestGmpOperators.slash__MPRational__MPRational__MPRational_;
|
|
const
|
|
N1 = 5;
|
|
D1 = 2;
|
|
N2 = -7;
|
|
D2 = 3;
|
|
var quotient, dividend, divisor: MPRational;
|
|
begin
|
|
q_init(dividend);
|
|
q_init(divisor);
|
|
q_set_si(dividend, N1, D1);
|
|
q_set_si(divisor, N2, D2);
|
|
quotient := dividend / divisor;
|
|
assert(q_cmp_si(quotient, -N1 * D2, -D1 * N2) = 0);
|
|
end;
|
|
|
|
// operator := (op: double): MPFloat;
|
|
procedure TTestGmpOperators.assign_double_MPFloat_;
|
|
const N = -1.5;
|
|
var rop: MPFloat;
|
|
begin
|
|
rop := N;
|
|
assert(f_get_d(rop) = N);
|
|
end;
|
|
|
|
// operator := (op: double): MPInteger;
|
|
procedure TTestGmpOperators.assign_double_MPInteger_;
|
|
const OP_ = 1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
rop := OP_;
|
|
assert(z_get_si(rop) = OP_);
|
|
end;
|
|
|
|
// operator := (op: double): MPRational;
|
|
procedure TTestGmpOperators.assign_double_MPRational_;
|
|
const
|
|
OP_1 = -1;
|
|
OP_2 = 2;
|
|
var rop: MPRational;
|
|
begin
|
|
rop := OP_1 / OP_2;
|
|
assert(q_cmp_si(rop, OP_1, OP_2) = 0);
|
|
end;
|
|
|
|
// operator := (op: MPFloat): cardinal;
|
|
procedure TTestGmpOperators.assign__MPFloat_Cardinal;
|
|
const OP = 1000000;
|
|
var rop: MPFloat;
|
|
begin
|
|
rop := OP;
|
|
assert(f_get_ui(rop) = OP);
|
|
end;
|
|
|
|
// operator := (op: MPFloat): double;
|
|
procedure TTestGmpOperators.assign__MPFloat_double;
|
|
const N = -1.5;
|
|
var rop: MPFloat;
|
|
begin
|
|
rop := N;
|
|
assert(f_get_d(rop) = N);
|
|
end;
|
|
|
|
// operator := (op: MPFloat): integer;
|
|
procedure TTestGmpOperators.assign__MPFloat_integer;
|
|
const OP = -1000000;
|
|
var rop: MPFloat;
|
|
begin
|
|
rop := OP;
|
|
assert(f_get_si(rop) = OP);
|
|
end;
|
|
|
|
// operator := (op: MPFloat): mpf_t;
|
|
procedure TTestGmpOperators.assign__MPFloat_mpf_t;
|
|
const N = -1000000;
|
|
var
|
|
rop: mpf_t;
|
|
op: MPFloat;
|
|
begin
|
|
f_init_set_si(op, N);
|
|
rop := op;
|
|
assert(mpf_get_si(rop) = N);
|
|
mpf_clear(rop);
|
|
end;
|
|
|
|
// operator := (op: MPFloat): MPInteger;
|
|
procedure TTestGmpOperators.assign__MPFloat__MPInteger_;
|
|
const OP_ = -10;
|
|
var
|
|
op: MPFloat;
|
|
rop: MPInteger;
|
|
begin
|
|
f_init_set_si(op, OP_);
|
|
rop := op;
|
|
assert(z_get_si(rop) = OP_);
|
|
end;
|
|
|
|
// operator := (op: MPFloat): MPRational;
|
|
procedure TTestGmpOperators.assign__MPFloat__MPRational_;
|
|
const OP_ = -10;
|
|
var
|
|
op: MPFloat;
|
|
rop: MPRational;
|
|
begin
|
|
f_init_set_si(op, OP_);
|
|
rop := op;
|
|
assert(q_get_d(rop) = OP_);
|
|
end;
|
|
|
|
// operator := (op: MPFloat): string;
|
|
procedure TTestGmpOperators.assign__MPFloat_string;
|
|
const
|
|
N = 123456;
|
|
S = '123456';
|
|
var
|
|
op: MPFloat;
|
|
r: string;
|
|
begin
|
|
f_init_set_d(op, N);
|
|
r := op;
|
|
assert(r = S);
|
|
end;
|
|
|
|
// operator := (op: MPFloat): valsint;
|
|
procedure TTestGmpOperators.assign__MPFloat_valsint;
|
|
const OP_ = -1000000;
|
|
var
|
|
op: MPFloat;
|
|
r: valsint;
|
|
begin
|
|
f_init_set_si(op, OP_);
|
|
r := op;
|
|
assert(r = OP_);
|
|
end;
|
|
|
|
// operator := (op: MPFloat): valuint;
|
|
procedure TTestGmpOperators.assign__MPFloat_valuint;
|
|
const OP_ = 1000000;
|
|
var
|
|
op: MPFloat;
|
|
r: valuint;
|
|
begin
|
|
f_init_set_si(op, OP_);
|
|
r := op;
|
|
assert(r = OP_);
|
|
end;
|
|
|
|
// operator := (var op: mpf_t): MPFloat;
|
|
procedure TTestGmpOperators.assign_mpf_t_MPFloat_;
|
|
const N = -1000000;
|
|
var
|
|
op: mpf_t;
|
|
rop: MPFloat;
|
|
begin
|
|
mpf_init_set_si(op, N);
|
|
rop := op;
|
|
assert(f_get_si(rop) = N);
|
|
mpf_clear(op);
|
|
end;
|
|
|
|
// operator := (op: MPInteger): cardinal;
|
|
procedure TTestGmpOperators.assign__MPInteger_cardinal;
|
|
const N = 1000000;
|
|
var
|
|
op: MPInteger;
|
|
r: cardinal;
|
|
begin
|
|
z_init_set_ui(op, N);
|
|
r := op;
|
|
assert(r = N);
|
|
end;
|
|
|
|
// operator := (op: MPInteger): double;
|
|
procedure TTestGmpOperators.assign__MPInteger_double;
|
|
const N = -1000;
|
|
var
|
|
op: MPInteger;
|
|
r: double;
|
|
begin
|
|
z_init_set_si(op, N);
|
|
r := op;
|
|
assert(r = N);
|
|
end;
|
|
|
|
// operator := (op: MPInteger): integer;
|
|
procedure TTestGmpOperators.assign__MPInteger_integer;
|
|
const N = -1000000;
|
|
var
|
|
op: MPInteger;
|
|
r: integer;
|
|
begin
|
|
z_init_set_si(op, N);
|
|
r := op;
|
|
assert(r = N);
|
|
end;
|
|
|
|
// operator := (op: MPInteger): MPFloat;
|
|
procedure TTestGmpOperators.assign__MPInteger__MPFloat_;
|
|
const
|
|
OP_1 = -13;
|
|
var
|
|
rop: MPFloat;
|
|
op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, OP_1);
|
|
rop := op;
|
|
assert(f_get_si(rop) = OP_1);
|
|
end;
|
|
|
|
// operator := (op: MPInteger): MPRational;
|
|
procedure TTestGmpOperators.assign__MPInteger__MPRational_;
|
|
const
|
|
OP_1 = -13;
|
|
var
|
|
rational: MPRational;
|
|
op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, OP_1);
|
|
rational := op;
|
|
assert(q_cmp_si(rational, OP_1, 1) = 0);
|
|
end;
|
|
|
|
// operator := (op: MPInteger): mpz_t;
|
|
procedure TTestGmpOperators.assign__MPInteger_mpz_t;
|
|
const N = -1000000;
|
|
var
|
|
rop: mpz_t;
|
|
op: MPInteger;
|
|
begin
|
|
z_init_set_si(op, N);
|
|
rop := op;
|
|
assert(mpz_get_si(rop) = N);
|
|
mpz_clear(rop);
|
|
end;
|
|
|
|
// operator := (op: MPInteger): string;
|
|
procedure TTestGmpOperators.assign__MPInteger_string;
|
|
const
|
|
N = 123456;
|
|
S = '123456';
|
|
var
|
|
op: MPInteger;
|
|
r: string;
|
|
begin
|
|
z_init_set_ui(op, N);
|
|
r := op;
|
|
assert(r = S);
|
|
end;
|
|
|
|
// operator := (op: MPInteger): valsint;
|
|
procedure TTestGmpOperators.assign__MPInteger_valsint;
|
|
const N = -1000000;
|
|
var
|
|
op: MPInteger;
|
|
r: valsint;
|
|
begin
|
|
z_init_set_si(op, N);
|
|
r := op;
|
|
assert(r = N);
|
|
end;
|
|
|
|
// operator := (op: MPInteger): valuint;
|
|
procedure TTestGmpOperators.assign__MPInteger_valuint;
|
|
const N = 1000000;
|
|
var
|
|
op: MPInteger;
|
|
r: valuint;
|
|
begin
|
|
z_init_set_ui(op, N);
|
|
r := op;
|
|
assert(r = N);
|
|
end;
|
|
|
|
// operator := (var op: mpq_t): MPRational;
|
|
procedure TTestGmpOperators.assign_mpq_t_MPRational_;
|
|
const
|
|
N = -17;
|
|
D = 3;
|
|
var
|
|
op: mpq_t;
|
|
rop: MPRational;
|
|
begin
|
|
mpq_init(op);
|
|
mpq_set_si(op, N, D);
|
|
rop := op;
|
|
assert(q_cmp_si(rop, N, D) = 0);
|
|
mpq_clear(op);
|
|
end;
|
|
|
|
// operator := (op: MPRandState): randstate_t;
|
|
procedure TTestGmpOperators.assign__MPRandState_randstate_t;
|
|
var
|
|
op: MPRandState;
|
|
rop: randstate_t;
|
|
begin
|
|
randinit_default(op);
|
|
rop := op;
|
|
assert(rnd_test(rop));
|
|
mp_randclear(rop);
|
|
end;
|
|
|
|
// operator := (op: MPRational): double;
|
|
procedure TTestGmpOperators.assign__MPRational_double;
|
|
const
|
|
OP_1 = -1;
|
|
OP_2 = 2;
|
|
var
|
|
op: MPRational;
|
|
r: double;
|
|
begin
|
|
q_init(op);
|
|
q_set_si(op, OP_1, OP_2);
|
|
r := op;
|
|
assert(r = OP_1 / OP_2);
|
|
end;
|
|
|
|
// operator := (op: MPRational): MPFloat;
|
|
procedure TTestGmpOperators.assign__MPRational__MPFloat_;
|
|
const OP_ = -10;
|
|
var
|
|
op: MPRational;
|
|
rop: MPFloat;
|
|
begin
|
|
q_init(op);
|
|
q_set_si(op, OP_, 1);
|
|
rop := op;
|
|
assert(f_get_si(rop) = OP_);
|
|
end;
|
|
|
|
// operator := (op: MPRational): MPInteger;
|
|
procedure TTestGmpOperators.assign__MPRational__MPInteger_;
|
|
const OP_ = -10;
|
|
var
|
|
op: MPRational;
|
|
rop: MPInteger;
|
|
begin
|
|
q_init(op);
|
|
q_set_si(op, OP_, 1);
|
|
rop := op;
|
|
assert(z_get_si(rop) = OP_);
|
|
end;
|
|
|
|
// operator := (op: MPRational): mpq_t;
|
|
procedure TTestGmpOperators.assign__MPRational_mpq_t;
|
|
const
|
|
OP_1 = -13;
|
|
OP_2 = 17;
|
|
var
|
|
rational: mpq_t;
|
|
op: MPRational;
|
|
begin
|
|
q_init(op);
|
|
q_set_si(op, OP_1, OP_2);
|
|
rational := op;
|
|
assert(mpq_cmp_si(rational, OP_1, OP_2) = 0);
|
|
mpq_clear(rational);
|
|
end;
|
|
|
|
// operator := (op: MPRational): string;
|
|
procedure TTestGmpOperators.assign__MPRational_string;
|
|
const
|
|
N = 5;
|
|
D = 3;
|
|
S = '5/3';
|
|
var
|
|
op: MPRational;
|
|
r: string;
|
|
begin
|
|
q_init(op);
|
|
q_set_si(op, N, D);
|
|
r := op;
|
|
assert(r = S);
|
|
end;
|
|
|
|
// operator := (var op: mpz_t): MPInteger;
|
|
procedure TTestGmpOperators.assign_mpz_t_MPInteger_;
|
|
const N = -1000000;
|
|
var
|
|
op: mpz_t;
|
|
rop: MPInteger;
|
|
begin
|
|
mpz_init_set_si(op, N);
|
|
rop := op;
|
|
assert(z_get_si(rop) = N);
|
|
mpz_clear(op);
|
|
end;
|
|
|
|
// operator := (var op: randstate_t): MPRandState;
|
|
procedure TTestGmpOperators.assign_randstate_t_MPRandState_;
|
|
var
|
|
op: randstate_t;
|
|
rop: MPRandState;
|
|
begin
|
|
mp_randinit_default(op);
|
|
rop := op;
|
|
assert(rnd_test(rop.ptr^));
|
|
mp_randclear(op);
|
|
end;
|
|
|
|
// operator := (op: string): MPFloat;
|
|
procedure TTestGmpOperators.assign_string_MPFloat_;
|
|
const N = -123;
|
|
var rop: MPFloat;
|
|
begin
|
|
rop := inttostr(N);
|
|
assert(f_get_si(rop) = N);
|
|
end;
|
|
|
|
// operator := (op: string): MPInteger;
|
|
procedure TTestGmpOperators.assign_string_MPInteger_;
|
|
const N = -123;
|
|
var rop: MPInteger;
|
|
begin
|
|
rop := inttostr(N);
|
|
assert(z_get_si(rop) = N);
|
|
end;
|
|
|
|
// operator := (op: string): MPRational;
|
|
procedure TTestGmpOperators.assign_string_MPRational_;
|
|
const
|
|
N = 5;
|
|
D = 3;
|
|
S = '5/3';
|
|
var rop: MPRational;
|
|
begin
|
|
rop := S;
|
|
assert(q_cmp_si(rop, N, D) = 0);
|
|
end;
|
|
|
|
// operator := (op: valsint): MPFloat;
|
|
procedure TTestGmpOperators.assign_valsint_MPFloat_;
|
|
const OP = -1000000;
|
|
var rop: MPFloat;
|
|
begin
|
|
rop := OP;
|
|
assert(f_get_si(rop) = OP);
|
|
end;
|
|
|
|
// operator := (op: valsint): MPInteger;
|
|
procedure TTestGmpOperators.assign_valsint_MPInteger_;
|
|
const OP = -1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
rop := OP;
|
|
assert(z_get_si(rop) = OP);
|
|
end;
|
|
|
|
// operator := (op: valsint): MPRational;
|
|
procedure TTestGmpOperators.assign_valsint_MPRational_;
|
|
const OP = -1000000;
|
|
var rop: MPRational;
|
|
begin
|
|
rop := OP;
|
|
assert(q_cmp_si(rop, OP, 1) = 0);
|
|
end;
|
|
|
|
// operator := (op: valuint): MPFloat;
|
|
procedure TTestGmpOperators.assign_valuint_MPFloat_;
|
|
const OP = 1000000;
|
|
var rop: MPFloat;
|
|
begin
|
|
rop := OP;
|
|
assert(f_get_ui(rop) = OP);
|
|
end;
|
|
|
|
// operator := (op: valuint): MPInteger;
|
|
procedure TTestGmpOperators.assign_valuint_MPInteger_;
|
|
const OP = 1000000;
|
|
var rop: MPInteger;
|
|
begin
|
|
rop := OP;
|
|
assert(z_get_ui(rop) = OP);
|
|
end;
|
|
|
|
// operator := (op: valuint): MPRational;
|
|
procedure TTestGmpOperators.assign_valuint_MPRational_;
|
|
const OP = 1000000;
|
|
var rop: MPRational;
|
|
begin
|
|
rop := OP;
|
|
assert(q_cmp_ui(rop, OP, 1) = 0);
|
|
end;
|
|
|
|
// operator < (op1: MPFloat; op2: MPFloat): boolean;
|
|
procedure TTestGmpOperators.lt__MPFloat__MPFloat_boolean;
|
|
const
|
|
OP1_ = 1.2;
|
|
OP2_ = OP1_ + 1;
|
|
var op1, op2: MPFloat;
|
|
begin
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
assert(op1 < op2);
|
|
end;
|
|
|
|
// operator < (op1: MPInteger; op2: MPInteger): boolean;
|
|
procedure TTestGmpOperators.lt__MPInteger__MPInteger_boolean;
|
|
const
|
|
OP1_ = 12;
|
|
OP2_ = OP1_ + 1;
|
|
var op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_d(op1, OP1_);
|
|
z_init_set_d(op2, OP2_);
|
|
assert(op1 < op2);
|
|
end;
|
|
|
|
// operator < (op1: MPRational; op2: MPRational): boolean;
|
|
procedure TTestGmpOperators.lt__MPRational__MPRational_boolean;
|
|
const
|
|
OP1_ = 12;
|
|
OP2_ = OP1_ + 1;
|
|
var op1, op2: MPRational;
|
|
begin
|
|
q_init(op1);
|
|
q_init(op2);
|
|
q_set_si(op1, OP1_, 1);
|
|
q_set_si(op2, OP2_, 1);
|
|
assert(op1 < op2);
|
|
end;
|
|
|
|
// operator <= (op1: MPFloat; op2: MPFloat): boolean;
|
|
procedure TTestGmpOperators.le__MPFloat__MPFloat_boolean;
|
|
const
|
|
OP1_ = 1.2;
|
|
OP2_ = OP1_ + 1;
|
|
var op1, op2: MPFloat;
|
|
begin
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
assert(op1 <= op2);
|
|
f_set_d(op2, OP1_);
|
|
assert(op1 <= op2);
|
|
end;
|
|
|
|
// operator <= (op1: MPInteger; op2: MPInteger): boolean;
|
|
procedure TTestGmpOperators.le__MPInteger__MPInteger_boolean;
|
|
const
|
|
OP1_ = 12;
|
|
OP2_ = OP1_ + 1;
|
|
var op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_ui(op1, OP1_);
|
|
z_init_set_ui(op2, OP2_);
|
|
assert(op1 <= op2);
|
|
z_set_ui(op2, OP1_);
|
|
assert(op1 <= op2);
|
|
end;
|
|
|
|
// operator <= (op1: MPRational; op2: MPRational): boolean;
|
|
procedure TTestGmpOperators.le__MPRational__MPRational_boolean;
|
|
const
|
|
OP1_ = 12;
|
|
OP2_ = OP1_ + 1;
|
|
var op1, op2: MPRational;
|
|
begin
|
|
q_init(op1);
|
|
q_init(op2);
|
|
q_set_si(op1, OP1_, 1);
|
|
q_set_si(op2, OP2_, 1);
|
|
assert(op1 <= op2);
|
|
q_set_si(op2, OP1_, 1);
|
|
assert(op1 <= op2);
|
|
end;
|
|
|
|
// operator > (op1: MPFloat; op2: MPFloat): boolean;
|
|
procedure TTestGmpOperators.gt__MPFloat__MPFloat_boolean;
|
|
const
|
|
OP1_ = 1.2;
|
|
OP2_ = OP1_ - 1;
|
|
var op1, op2: MPFloat;
|
|
begin
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
assert(op1 > op2);
|
|
end;
|
|
|
|
// operator > (op1: MPInteger; op2: MPInteger): boolean;
|
|
procedure TTestGmpOperators.gt__MPInteger__MPInteger_boolean;
|
|
const
|
|
OP1_ = 12;
|
|
OP2_ = OP1_ - 1;
|
|
var op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_d(op1, OP1_);
|
|
z_init_set_d(op2, OP2_);
|
|
assert(op1 > op2);
|
|
end;
|
|
|
|
// operator > (op1: MPRational; op2: MPRational): boolean;
|
|
procedure TTestGmpOperators.gt__MPRational__MPRational_boolean;
|
|
const
|
|
OP1_ = 12;
|
|
OP2_ = OP1_ - 1;
|
|
var op1, op2: MPRational;
|
|
begin
|
|
q_init(op1);
|
|
q_init(op2);
|
|
q_set_si(op1, OP1_, 1);
|
|
q_set_si(op2, OP2_, 1);
|
|
assert(op1 > op2);
|
|
end;
|
|
|
|
// operator >= (op1: MPFloat; op2: MPFloat): boolean;
|
|
procedure TTestGmpOperators.ge__MPFloat__MPFloat_boolean;
|
|
const
|
|
OP1_ = 1.2;
|
|
OP2_ = OP1_ - 1;
|
|
var op1, op2: MPFloat;
|
|
begin
|
|
f_init_set_d(op1, OP1_);
|
|
f_init_set_d(op2, OP2_);
|
|
assert(op1 >= op2);
|
|
f_set_d(op2, OP1_);
|
|
assert(op1 >= op2);
|
|
end;
|
|
|
|
// operator >= (op1: MPInteger; op2: MPInteger): boolean;
|
|
procedure TTestGmpOperators.ge__MPInteger__MPInteger_boolean;
|
|
const
|
|
OP1_ = 12;
|
|
OP2_ = OP1_ - 1;
|
|
var op1, op2: MPInteger;
|
|
begin
|
|
z_init_set_ui(op1, OP1_);
|
|
z_init_set_ui(op2, OP2_);
|
|
assert(op1 >= op2);
|
|
z_set_ui(op2, OP1_);
|
|
assert(op1 >= op2);
|
|
end;
|
|
|
|
// operator >= (op1: MPRational; op2: MPRational): boolean;
|
|
procedure TTestGmpOperators.ge__MPRational__MPRational_boolean;
|
|
const
|
|
OP1_ = 12;
|
|
OP2_ = OP1_ - 1;
|
|
var op1, op2: MPRational;
|
|
begin
|
|
q_init(op1);
|
|
q_init(op2);
|
|
q_set_si(op1, OP1_, 1);
|
|
q_set_si(op2, OP2_, 1);
|
|
assert(op1 >= op2);
|
|
q_set_si(op2, OP1_, 1);
|
|
assert(op1 >= op2);
|
|
end;
|
|
|