mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 15:49:16 +02:00
* GMP initial version.
git-svn-id: trunk@13667 -
This commit is contained in:
parent
1f6b55290e
commit
da9458587d
16
.gitattributes
vendored
16
.gitattributes
vendored
@ -1814,6 +1814,22 @@ packages/ggi/fpmake.pp svneol=native#text/plain
|
|||||||
packages/ggi/src/ggi.pp svneol=native#text/plain
|
packages/ggi/src/ggi.pp svneol=native#text/plain
|
||||||
packages/ggi/src/ggi2d.pp svneol=native#text/plain
|
packages/ggi/src/ggi2d.pp svneol=native#text/plain
|
||||||
packages/ggi/src/gii.pp svneol=native#text/plain
|
packages/ggi/src/gii.pp svneol=native#text/plain
|
||||||
|
packages/gmp/Makefile svneol=native#text/plain
|
||||||
|
packages/gmp/Makefile.fpc svneol=native#text/plain
|
||||||
|
packages/gmp/examples/Makefile svneol=native#text/plain
|
||||||
|
packages/gmp/examples/Makefile.fpc svneol=native#text/plain
|
||||||
|
packages/gmp/examples/gmp_accept_test.pas svneol=native#text/plain
|
||||||
|
packages/gmp/examples/gmp_test_impl.inc svneol=native#text/plain
|
||||||
|
packages/gmp/examples/gmp_test_intf.inc svneol=native#text/plain
|
||||||
|
packages/gmp/examples/gmp_testcase.pas svneol=native#text/plain
|
||||||
|
packages/gmp/examples/pidigits_example.pas svneol=native#text/plain
|
||||||
|
packages/gmp/examples/pidigits_example2.pas svneol=native#text/plain
|
||||||
|
packages/gmp/examples/printf_example.pas svneol=native#text/plain
|
||||||
|
packages/gmp/examples/printf_example2.pas svneol=native#text/plain
|
||||||
|
packages/gmp/examples/scanf_example.pas svneol=native#text/plain
|
||||||
|
packages/gmp/examples/scanf_example2.pas svneol=native#text/plain
|
||||||
|
packages/gmp/readme svneol=native#text/plain
|
||||||
|
packages/gmp/src/gmp.pas svneol=native#text/plain
|
||||||
packages/gnome1/Makefile svneol=native#text/plain
|
packages/gnome1/Makefile svneol=native#text/plain
|
||||||
packages/gnome1/Makefile.fpc svneol=native#text/plain
|
packages/gnome1/Makefile.fpc svneol=native#text/plain
|
||||||
packages/gnome1/examples/gconfcallback1.pp svneol=native#text/plain
|
packages/gnome1/examples/gconfcallback1.pp svneol=native#text/plain
|
||||||
|
2803
packages/gmp/Makefile
Normal file
2803
packages/gmp/Makefile
Normal file
File diff suppressed because it is too large
Load Diff
32
packages/gmp/Makefile.fpc
Normal file
32
packages/gmp/Makefile.fpc
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#
|
||||||
|
# Makefile.fpc for Free Pascal ImLib 1.x Packages
|
||||||
|
#
|
||||||
|
|
||||||
|
[package]
|
||||||
|
name=gmp
|
||||||
|
version=2.5.1
|
||||||
|
|
||||||
|
[target]
|
||||||
|
units=gmp
|
||||||
|
exampledirs=examples
|
||||||
|
|
||||||
|
[require]
|
||||||
|
libc=y
|
||||||
|
|
||||||
|
[compiler]
|
||||||
|
includedir=src
|
||||||
|
sourcedir=src
|
||||||
|
|
||||||
|
|
||||||
|
[install]
|
||||||
|
fpcpackage=y
|
||||||
|
fpcsubdir=packages
|
||||||
|
|
||||||
|
[default]
|
||||||
|
fpcdir=../..
|
||||||
|
|
||||||
|
[shared]
|
||||||
|
build=n
|
||||||
|
|
||||||
|
[rules]
|
||||||
|
.NOTPARALLEL:
|
2045
packages/gmp/examples/Makefile
Normal file
2045
packages/gmp/examples/Makefile
Normal file
File diff suppressed because it is too large
Load Diff
21
packages/gmp/examples/Makefile.fpc
Normal file
21
packages/gmp/examples/Makefile.fpc
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#
|
||||||
|
# Makefile.fpc for Free Pascal GTK 2.x.y Examples
|
||||||
|
#
|
||||||
|
|
||||||
|
[target]
|
||||||
|
programs=gmp_accept_test gmp_testcase pidigits_example pidigits_example2 printf_example printf_example2 scanf_example scanf_example2
|
||||||
|
|
||||||
|
[require]
|
||||||
|
packages=gmp
|
||||||
|
|
||||||
|
[install]
|
||||||
|
fpcpackage=y
|
||||||
|
|
||||||
|
[default]
|
||||||
|
fpcdir=../../..
|
||||||
|
|
||||||
|
[rules]
|
||||||
|
.NOTPARALLEL:
|
||||||
|
|
||||||
|
|
||||||
|
|
45
packages/gmp/examples/gmp_accept_test.pas
Normal file
45
packages/gmp/examples/gmp_accept_test.pas
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
program gmp_accept_test;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
uses
|
||||||
|
heaptrc, testutils, strutils, math, sysutils, gmp, classes;
|
||||||
|
|
||||||
|
|
||||||
|
type
|
||||||
|
TTestCase = class(TPersistent);
|
||||||
|
TTestCases = class of TTestCase;
|
||||||
|
|
||||||
|
{$include gmp_test_intf}
|
||||||
|
{$include gmp_test_impl}
|
||||||
|
|
||||||
|
procedure Run(Tests: array of TTestCases);
|
||||||
|
var
|
||||||
|
TestObj: TTestCase;
|
||||||
|
MethodList: TStringList;
|
||||||
|
TI, MI: integer;
|
||||||
|
Test: procedure of object;
|
||||||
|
begin
|
||||||
|
for TI := 0 to Length(Tests) - 1 do begin
|
||||||
|
TestObj := Tests[TI].Create;
|
||||||
|
MethodList := TStringList.Create;
|
||||||
|
try
|
||||||
|
TMethod(Test).Data := TestObj;
|
||||||
|
GetMethodList(TestObj, MethodList);
|
||||||
|
for MI := 0 to MethodList.Count - 1 do begin
|
||||||
|
TMethod(Test).Code := MethodList.Objects[MI];
|
||||||
|
Test;
|
||||||
|
end;
|
||||||
|
WriteLn(Format('%s: Tests executed: %d.', [TestObj.ClassName, MethodList.Count]));
|
||||||
|
finally
|
||||||
|
MethodList.Free;
|
||||||
|
TestObj.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
HaltOnNotReleased := True; // exit code wanted
|
||||||
|
Run([TTestGmpBinding, TTestGmpExtensions, TTestGmpOperators]);
|
||||||
|
end.
|
||||||
|
|
7848
packages/gmp/examples/gmp_test_impl.inc
Normal file
7848
packages/gmp/examples/gmp_test_impl.inc
Normal file
File diff suppressed because it is too large
Load Diff
674
packages/gmp/examples/gmp_test_intf.inc
Normal file
674
packages/gmp/examples/gmp_test_intf.inc
Normal file
@ -0,0 +1,674 @@
|
|||||||
|
{ Note: This doesn't test GMP per se.
|
||||||
|
|
||||||
|
Not covered:
|
||||||
|
mp_printf
|
||||||
|
mp_scanf
|
||||||
|
mpz_array_init
|
||||||
|
errno
|
||||||
|
}
|
||||||
|
|
||||||
|
{$assertions on - keep this}
|
||||||
|
|
||||||
|
type
|
||||||
|
|
||||||
|
{ TTestGmpBinding }
|
||||||
|
|
||||||
|
TTestGmpBinding = class(TTestCase)
|
||||||
|
published
|
||||||
|
procedure mp_get_memory_functions_test;
|
||||||
|
procedure mp_set_memory_functions_test;
|
||||||
|
|
||||||
|
procedure mp_randinit_default_test;
|
||||||
|
procedure mp_randinit_mt_test;
|
||||||
|
procedure mp_randinit_lc_2exp_test;
|
||||||
|
procedure mp_randinit_lc_2exp_size_test;
|
||||||
|
procedure mp_randinit_set_test;
|
||||||
|
procedure mp_randclear_test;
|
||||||
|
procedure mp_randseed_test;
|
||||||
|
procedure mp_randseed_ui_test;
|
||||||
|
procedure mp_urandomb_ui_test;
|
||||||
|
procedure mp_urandomm_ui_test;
|
||||||
|
|
||||||
|
procedure mp_asprintf_test;
|
||||||
|
procedure mp_asprintf_test2;
|
||||||
|
procedure mp_snprintf_test;
|
||||||
|
procedure mp_snprintf_test2;
|
||||||
|
procedure mp_sprintf_test;
|
||||||
|
procedure mp_sprintf_test2;
|
||||||
|
procedure mp_sscanf_test;
|
||||||
|
procedure mp_sscanf_test2;
|
||||||
|
|
||||||
|
procedure mpz_init_test;
|
||||||
|
procedure mpz_clear_test;
|
||||||
|
procedure mpz_init2_test;
|
||||||
|
procedure mpz_init_set_si_test;
|
||||||
|
procedure mpz_init_set_ui_test;
|
||||||
|
procedure mpz_init_set_d_test;
|
||||||
|
procedure mpz_init_set_test;
|
||||||
|
procedure mpz_init_set_str_test;
|
||||||
|
procedure mpz_realloc_test;
|
||||||
|
procedure mpz_realloc2_test;
|
||||||
|
procedure mpz_getlimbn_test;
|
||||||
|
procedure mpz_export_test;
|
||||||
|
procedure mpz_import_test;
|
||||||
|
procedure mpz_swap_test;
|
||||||
|
procedure mpz_set_test;
|
||||||
|
procedure mpz_set_d_test;
|
||||||
|
procedure mpz_set_f_test;
|
||||||
|
procedure mpz_set_q_test;
|
||||||
|
procedure mpz_set_si_test;
|
||||||
|
procedure mpz_set_str_test;
|
||||||
|
procedure mpz_set_ui_test;
|
||||||
|
procedure mpz_get_d_test;
|
||||||
|
procedure mpz_get_d_2exp_test;
|
||||||
|
procedure mpz_get_si_test;
|
||||||
|
procedure mpz_get_str_test;
|
||||||
|
procedure mpz_get_ui_test;
|
||||||
|
procedure mpz_add_test;
|
||||||
|
procedure mpz_add_ui_test;
|
||||||
|
procedure mpz_sub_test;
|
||||||
|
procedure mpz_sub_ui_test;
|
||||||
|
procedure mpz_ui_sub_test;
|
||||||
|
procedure mpz_mul_test;
|
||||||
|
procedure mpz_mul_si_test;
|
||||||
|
procedure mpz_mul_ui_test;
|
||||||
|
procedure mpz_addmul_test;
|
||||||
|
procedure mpz_addmul_ui_test;
|
||||||
|
procedure mpz_submul_test;
|
||||||
|
procedure mpz_submul_ui_test;
|
||||||
|
procedure mpz_mul_2exp_test;
|
||||||
|
procedure mpz_neg_test;
|
||||||
|
procedure mpz_abs_test;
|
||||||
|
|
||||||
|
procedure mpz_cdiv_q_test;
|
||||||
|
procedure mpz_fdiv_q_test;
|
||||||
|
procedure mpz_tdiv_q_test;
|
||||||
|
procedure mpz_cdiv_q_2exp_test;
|
||||||
|
procedure mpz_fdiv_q_2exp_test;
|
||||||
|
procedure mpz_tdiv_q_2exp_test;
|
||||||
|
procedure mpz_cdiv_q_ui_test;
|
||||||
|
procedure mpz_fdiv_q_ui_test;
|
||||||
|
procedure mpz_tdiv_q_ui_test;
|
||||||
|
procedure mpz_cdiv_qr_test;
|
||||||
|
procedure mpz_fdiv_qr_test;
|
||||||
|
procedure mpz_tdiv_qr_test;
|
||||||
|
procedure mpz_cdiv_qr_ui_test;
|
||||||
|
procedure mpz_fdiv_qr_ui_test;
|
||||||
|
procedure mpz_tdiv_qr_ui_test;
|
||||||
|
procedure mpz_cdiv_r_test;
|
||||||
|
procedure mpz_fdiv_r_test;
|
||||||
|
procedure mpz_tdiv_r_test;
|
||||||
|
procedure mpz_cdiv_r_2exp_test;
|
||||||
|
procedure mpz_fdiv_r_2exp_test;
|
||||||
|
procedure mpz_tdiv_r_2exp_test;
|
||||||
|
procedure mpz_cdiv_r_ui_test;
|
||||||
|
procedure mpz_fdiv_r_ui_test;
|
||||||
|
procedure mpz_tdiv_r_ui_test;
|
||||||
|
procedure mpz_cdiv_ui_test;
|
||||||
|
procedure mpz_fdiv_ui_test;
|
||||||
|
procedure mpz_tdiv_ui_test;
|
||||||
|
|
||||||
|
procedure mpz_mod_test;
|
||||||
|
procedure mpz_divexact_test;
|
||||||
|
procedure mpz_divexact_ui_test;
|
||||||
|
procedure mpz_divisible_p_test;
|
||||||
|
procedure mpz_divisible_ui_p_test;
|
||||||
|
procedure mpz_divisible_2exp_p_test;
|
||||||
|
procedure mpz_congruent_p_test;
|
||||||
|
procedure mpz_congruent_2exp_p_test;
|
||||||
|
procedure mpz_congruent_ui_p_test;
|
||||||
|
procedure mpz_powm_test;
|
||||||
|
procedure mpz_powm_ui_test;
|
||||||
|
procedure mpz_pow_ui_test;
|
||||||
|
procedure mpz_ui_pow_ui_test;
|
||||||
|
procedure mpz_root_test;
|
||||||
|
procedure mpz_rootrem_test;
|
||||||
|
procedure mpz_sqrt_test;
|
||||||
|
procedure mpz_sqrtrem_test;
|
||||||
|
procedure mpz_perfect_power_p_test;
|
||||||
|
procedure mpz_perfect_square_p_test;
|
||||||
|
|
||||||
|
procedure mpz_probab_prime_p_test;
|
||||||
|
procedure mpz_nextprime_test;
|
||||||
|
procedure mpz_gcd_test;
|
||||||
|
procedure mpz_gcd_ui_test;
|
||||||
|
procedure mpz_gcdext_test;
|
||||||
|
procedure mpz_lcm_test;
|
||||||
|
procedure mpz_lcm_ui_test;
|
||||||
|
procedure mpz_invert_test;
|
||||||
|
procedure mpz_jacobi_test;
|
||||||
|
procedure mpz_kronecker_si_test;
|
||||||
|
procedure mpz_kronecker_ui_test;
|
||||||
|
procedure mpz_si_kronecker_test;
|
||||||
|
procedure mpz_ui_kronecker_test;
|
||||||
|
procedure mpz_remove_test;
|
||||||
|
procedure mpz_fac_ui_test;
|
||||||
|
procedure mpz_bin_ui_test;
|
||||||
|
procedure mpz_bin_uiui_test;
|
||||||
|
procedure mpz_fib_ui_test;
|
||||||
|
procedure mpz_fib2_ui_test;
|
||||||
|
procedure mpz_lucnum_ui_test;
|
||||||
|
procedure mpz_lucnum2_ui_test;
|
||||||
|
|
||||||
|
procedure mpz_cmp_test;
|
||||||
|
procedure mpz_cmp_d_test;
|
||||||
|
procedure mpz_cmp_si_test;
|
||||||
|
procedure mpz_cmp_ui_test;
|
||||||
|
procedure mpz_cmpabs_test;
|
||||||
|
procedure mpz_cmpabs_d_test;
|
||||||
|
procedure mpz_cmpabs_ui_test;
|
||||||
|
|
||||||
|
procedure mpz_and_test;
|
||||||
|
procedure mpz_ior_test;
|
||||||
|
procedure mpz_xor_test;
|
||||||
|
procedure mpz_com_test;
|
||||||
|
procedure mpz_popcount_test;
|
||||||
|
procedure mpz_hamdist_test;
|
||||||
|
procedure mpz_scan0_test;
|
||||||
|
procedure mpz_scan1_test;
|
||||||
|
procedure mpz_setbit_test;
|
||||||
|
procedure mpz_clrbit_test;
|
||||||
|
procedure mpz_combit_test;
|
||||||
|
procedure mpz_tstbit_test;
|
||||||
|
|
||||||
|
procedure mpz_urandomb_test;
|
||||||
|
procedure mpz_urandomm_test;
|
||||||
|
procedure mpz_rrandomb_test;
|
||||||
|
|
||||||
|
procedure mpz_fits_ushort_p_test;
|
||||||
|
procedure mpz_fits_sshort_p_test;
|
||||||
|
procedure mpz_fits_uint_p_test;
|
||||||
|
procedure mpz_fits_sint_p_test;
|
||||||
|
procedure mpz_fits_ulong_p_test;
|
||||||
|
procedure mpz_fits_slong_p_test;
|
||||||
|
procedure mpz_sizeinbase_test;
|
||||||
|
procedure mpz_size_test;
|
||||||
|
|
||||||
|
procedure mpq_init_test;
|
||||||
|
procedure mpq_clear_test;
|
||||||
|
procedure mpq_set_ui_test;
|
||||||
|
procedure mpq_set_si_test;
|
||||||
|
procedure mpq_canonicalize_test;
|
||||||
|
procedure mpq_set_test;
|
||||||
|
procedure mpq_setmpz_test;
|
||||||
|
procedure mpq_set_str_test;
|
||||||
|
procedure mpq_swap_test;
|
||||||
|
|
||||||
|
procedure mpq_get_d_test;
|
||||||
|
procedure mpq_set_d_test;
|
||||||
|
procedure mpq_set_f_test;
|
||||||
|
procedure mpq_get_str_test;
|
||||||
|
|
||||||
|
procedure mpq_add_test;
|
||||||
|
procedure mpq_sub_test;
|
||||||
|
procedure mpq_mul_test;
|
||||||
|
procedure mpq_mul_2exp_test;
|
||||||
|
procedure mpq_div_test;
|
||||||
|
procedure mpq_div_2exp_test;
|
||||||
|
procedure mpq_neg_test;
|
||||||
|
procedure mpq_abs_test;
|
||||||
|
procedure mpq_inv_test;
|
||||||
|
|
||||||
|
procedure mpq_cmp_test;
|
||||||
|
procedure mpq_cmp_si_test;
|
||||||
|
procedure mpq_cmp_ui_test;
|
||||||
|
procedure mpq_equal_test;
|
||||||
|
|
||||||
|
procedure mpq_get_num_test;
|
||||||
|
procedure mpq_get_den_test;
|
||||||
|
procedure mpq_set_num_test;
|
||||||
|
procedure mpq_set_den_test;
|
||||||
|
|
||||||
|
procedure mpf_get_default_prec_test;
|
||||||
|
procedure mpf_set_default_prec_test;
|
||||||
|
|
||||||
|
procedure mpf_init_test;
|
||||||
|
procedure mpf_init2_test;
|
||||||
|
procedure mpf_clear_test;
|
||||||
|
procedure mpf_get_prec_test;
|
||||||
|
procedure mpf_set_prec_test;
|
||||||
|
procedure mpf_set_prec_raw_test;
|
||||||
|
|
||||||
|
procedure mpf_set_q_test;
|
||||||
|
procedure mpf_set_ui_test;
|
||||||
|
procedure mpf_get_ui_test;
|
||||||
|
procedure mpf_set_si_test;
|
||||||
|
procedure mpf_get_si_test;
|
||||||
|
procedure mpf_set_test;
|
||||||
|
procedure mpf_set_str_test;
|
||||||
|
procedure mpf_swap_test;
|
||||||
|
|
||||||
|
procedure mpf_get_d_test;
|
||||||
|
procedure mpf_set_d_test;
|
||||||
|
procedure mpf_setmpz_test;
|
||||||
|
procedure mpf_get_d_2exp_test;
|
||||||
|
procedure mpf_get_str_test;
|
||||||
|
|
||||||
|
procedure mpf_add_test;
|
||||||
|
procedure mpf_add_ui_test;
|
||||||
|
procedure mpf_sub_test;
|
||||||
|
procedure mpf_sub_ui_test;
|
||||||
|
procedure mpf_ui_sub_test;
|
||||||
|
procedure mpf_mul_test;
|
||||||
|
procedure mpf_mul_ui_test;
|
||||||
|
procedure mpf_mul_2exp_test;
|
||||||
|
procedure mpf_div_test;
|
||||||
|
procedure mpf_div_ui_test;
|
||||||
|
procedure mpf_ui_div_test;
|
||||||
|
procedure mpf_div_2exp_test;
|
||||||
|
procedure mpf_sqrt_test;
|
||||||
|
procedure mpf_sqrt_ui_test;
|
||||||
|
procedure mpf_pow_ui_test;
|
||||||
|
procedure mpf_neg_test;
|
||||||
|
procedure mpf_abs_test;
|
||||||
|
|
||||||
|
procedure mpf_cmp_test;
|
||||||
|
procedure mpf_cmp_d_test;
|
||||||
|
procedure mpf_cmp_si_test;
|
||||||
|
procedure mpf_cmp_ui_test;
|
||||||
|
procedure mpf_eq_test;
|
||||||
|
procedure mpf_reldiff_test;
|
||||||
|
|
||||||
|
procedure mpf_ceil_test;
|
||||||
|
procedure mpf_floor_test;
|
||||||
|
procedure mpf_trunc_test;
|
||||||
|
procedure mpf_integer_p_test;
|
||||||
|
|
||||||
|
procedure mpf_fits_ushort_p_test;
|
||||||
|
procedure mpf_fits_sshort_p_test;
|
||||||
|
procedure mpf_fits_uint_p_test;
|
||||||
|
procedure mpf_fits_sint_p_test;
|
||||||
|
procedure mpf_fits_ulong_p_test;
|
||||||
|
procedure mpf_fits_slong_p_test;
|
||||||
|
|
||||||
|
procedure mpf_urandomb_test;
|
||||||
|
procedure mpf_random2_test;
|
||||||
|
|
||||||
|
procedure mpf_init_set_test;
|
||||||
|
procedure mpf_init_set_d_test;
|
||||||
|
procedure mpf_init_set_si_test;
|
||||||
|
procedure mpf_init_set_str_test;
|
||||||
|
procedure mpf_init_set_ui_test;
|
||||||
|
|
||||||
|
procedure mpn_add_n_test;
|
||||||
|
procedure mpn_add_1_test;
|
||||||
|
procedure mpn_add_test;
|
||||||
|
procedure mpn_sub_n_test;
|
||||||
|
procedure mpn_sub_1_test;
|
||||||
|
procedure mpn_sub_test;
|
||||||
|
procedure mpn_mul_n_test;
|
||||||
|
procedure mpn_mul_1_test;
|
||||||
|
procedure mpn_mul_test;
|
||||||
|
procedure mpn_addmul_1_test;
|
||||||
|
procedure mpn_submul_1_test;
|
||||||
|
procedure mpn_tdiv_qr_test;
|
||||||
|
procedure mpn_divrem_1_test;
|
||||||
|
procedure mpn_divexact_by3c_test;
|
||||||
|
procedure mpn_mod_1_test;
|
||||||
|
procedure mpn_lshift_test;
|
||||||
|
procedure mpn_rshift_test;
|
||||||
|
procedure mpn_cmp_test;
|
||||||
|
procedure mpn_gcd_test;
|
||||||
|
procedure mpn_gcd_1_test;
|
||||||
|
procedure mpn_gcdext_test;
|
||||||
|
procedure mpn_sqrtrem_test;
|
||||||
|
procedure mpn_get_str_test;
|
||||||
|
procedure mpn_set_str_test;
|
||||||
|
procedure mpn_scan0_test;
|
||||||
|
procedure mpn_scan1_test;
|
||||||
|
procedure mpn_popcount_test;
|
||||||
|
procedure mpn_hamdist_test;
|
||||||
|
procedure mpn_perfect_square_p_test;
|
||||||
|
|
||||||
|
procedure mpn_random_test;
|
||||||
|
procedure mpn_random2_test;
|
||||||
|
|
||||||
|
procedure bits_per_limb_test;
|
||||||
|
procedure version_test;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TTestGmpExtensions }
|
||||||
|
|
||||||
|
TTestGmpExtensions = class(TTestCase)
|
||||||
|
published
|
||||||
|
|
||||||
|
procedure randinit_default_test;
|
||||||
|
procedure randinit_mt_test;
|
||||||
|
procedure randinit_lc_2exp_test;
|
||||||
|
procedure randinit_lc_2exp_size_test;
|
||||||
|
procedure randinit_set_test;
|
||||||
|
procedure randclear_test;
|
||||||
|
procedure randseed_test;
|
||||||
|
procedure randseed_ui_test;
|
||||||
|
procedure urandomb_ui_test;
|
||||||
|
procedure urandomm_ui_test;
|
||||||
|
|
||||||
|
procedure z_init_test;
|
||||||
|
procedure z_clear_test;
|
||||||
|
procedure z_init2_test;
|
||||||
|
procedure z_init_set_si_test;
|
||||||
|
procedure z_init_set_ui_test;
|
||||||
|
procedure z_init_set_d_test;
|
||||||
|
procedure z_init_set_test;
|
||||||
|
procedure z_init_set_str_test;
|
||||||
|
procedure z_realloc_test;
|
||||||
|
procedure z_realloc2_test;
|
||||||
|
procedure z_getlimbn_test;
|
||||||
|
procedure z_export_test;
|
||||||
|
procedure z_import_test;
|
||||||
|
procedure z_swap_test;
|
||||||
|
procedure z_set_test;
|
||||||
|
procedure z_set_d_test;
|
||||||
|
procedure z_set_f_test;
|
||||||
|
procedure z_set_q_test;
|
||||||
|
procedure z_set_si_test;
|
||||||
|
procedure z_set_str_test;
|
||||||
|
procedure z_set_ui_test;
|
||||||
|
procedure z_get_d_test;
|
||||||
|
procedure z_get_d_2exp_test;
|
||||||
|
procedure z_get_si_test;
|
||||||
|
procedure z_get_str_test;
|
||||||
|
procedure z_get_ui_test;
|
||||||
|
procedure z_add_test;
|
||||||
|
procedure z_add_ui_test;
|
||||||
|
procedure z_sub_test;
|
||||||
|
procedure z_sub_ui_test;
|
||||||
|
procedure z_ui_sub_test;
|
||||||
|
procedure z_mul_test;
|
||||||
|
procedure z_mul_si_test;
|
||||||
|
procedure z_mul_ui_test;
|
||||||
|
procedure z_addmul_test;
|
||||||
|
procedure z_addmul_ui_test;
|
||||||
|
procedure z_submul_test;
|
||||||
|
procedure z_submul_ui_test;
|
||||||
|
procedure z_mul_2exp_test;
|
||||||
|
procedure z_neg_test;
|
||||||
|
procedure z_abs_test;
|
||||||
|
|
||||||
|
procedure z_cdiv_q_test;
|
||||||
|
procedure z_fdiv_q_test;
|
||||||
|
procedure z_tdiv_q_test;
|
||||||
|
procedure z_cdiv_q_2exp_test;
|
||||||
|
procedure z_fdiv_q_2exp_test;
|
||||||
|
procedure z_tdiv_q_2exp_test;
|
||||||
|
procedure z_cdiv_q_ui_test;
|
||||||
|
procedure z_fdiv_q_ui_test;
|
||||||
|
procedure z_tdiv_q_ui_test;
|
||||||
|
procedure z_cdiv_qr_test;
|
||||||
|
procedure z_fdiv_qr_test;
|
||||||
|
procedure z_tdiv_qr_test;
|
||||||
|
procedure z_cdiv_qr_ui_test;
|
||||||
|
procedure z_fdiv_qr_ui_test;
|
||||||
|
procedure z_tdiv_qr_ui_test;
|
||||||
|
procedure z_cdiv_r_test;
|
||||||
|
procedure z_fdiv_r_test;
|
||||||
|
procedure z_tdiv_r_test;
|
||||||
|
procedure z_cdiv_r_2exp_test;
|
||||||
|
procedure z_fdiv_r_2exp_test;
|
||||||
|
procedure z_tdiv_r_2exp_test;
|
||||||
|
procedure z_cdiv_r_ui_test;
|
||||||
|
procedure z_fdiv_r_ui_test;
|
||||||
|
procedure z_tdiv_r_ui_test;
|
||||||
|
procedure z_cdiv_ui_test;
|
||||||
|
procedure z_fdiv_ui_test;
|
||||||
|
procedure z_tdiv_ui_test;
|
||||||
|
|
||||||
|
procedure z_mod_test;
|
||||||
|
procedure z_divexact_test;
|
||||||
|
procedure z_divexact_ui_test;
|
||||||
|
procedure z_divisible_p_test;
|
||||||
|
procedure z_divisible_ui_p_test;
|
||||||
|
procedure z_divisible_2exp_p_test;
|
||||||
|
procedure z_congruent_p_test;
|
||||||
|
procedure z_congruent_2exp_p_test;
|
||||||
|
procedure z_congruent_ui_p_test;
|
||||||
|
procedure z_powm_test;
|
||||||
|
procedure z_powm_ui_test;
|
||||||
|
procedure z_pow_ui_test;
|
||||||
|
procedure z_ui_pow_ui_test;
|
||||||
|
procedure z_root_test;
|
||||||
|
procedure z_rootrem_test;
|
||||||
|
procedure z_sqrt_test;
|
||||||
|
procedure z_sqrtrem_test;
|
||||||
|
procedure z_perfect_power_p_test;
|
||||||
|
procedure z_perfect_square_p_test;
|
||||||
|
|
||||||
|
procedure z_probab_prime_p_test;
|
||||||
|
procedure z_nextprime_test;
|
||||||
|
procedure z_gcd_test;
|
||||||
|
procedure z_gcd_ui_test;
|
||||||
|
procedure z_gcdext_test;
|
||||||
|
procedure z_lcm_test;
|
||||||
|
procedure z_lcm_ui_test;
|
||||||
|
procedure z_invert_test;
|
||||||
|
procedure z_jacobi_test;
|
||||||
|
procedure z_kronecker_si_test;
|
||||||
|
procedure z_kronecker_ui_test;
|
||||||
|
procedure z_si_kronecker_test;
|
||||||
|
procedure z_ui_kronecker_test;
|
||||||
|
procedure z_remove_test;
|
||||||
|
procedure z_fac_ui_test;
|
||||||
|
procedure z_bin_ui_test;
|
||||||
|
procedure z_bin_uiui_test;
|
||||||
|
procedure z_fib_ui_test;
|
||||||
|
procedure z_fib2_ui_test;
|
||||||
|
procedure z_lucnum_ui_test;
|
||||||
|
procedure z_lucnum2_ui_test;
|
||||||
|
|
||||||
|
procedure z_cmp_test;
|
||||||
|
procedure z_cmp_d_test;
|
||||||
|
procedure z_cmp_si_test;
|
||||||
|
procedure z_cmp_ui_test;
|
||||||
|
procedure z_cmpabs_test;
|
||||||
|
procedure z_cmpabs_d_test;
|
||||||
|
procedure z_cmpabs_ui_test;
|
||||||
|
|
||||||
|
procedure z_and_test;
|
||||||
|
procedure z_ior_test;
|
||||||
|
procedure z_xor_test;
|
||||||
|
procedure z_com_test;
|
||||||
|
procedure z_popcount_test;
|
||||||
|
procedure z_hamdist_test;
|
||||||
|
procedure z_scan0_test;
|
||||||
|
procedure z_scan1_test;
|
||||||
|
procedure z_setbit_test;
|
||||||
|
procedure z_clrbit_test;
|
||||||
|
procedure z_combit_test;
|
||||||
|
procedure z_tstbit_test;
|
||||||
|
|
||||||
|
procedure z_urandomb_test;
|
||||||
|
procedure z_urandomm_test;
|
||||||
|
procedure z_rrandomb_test;
|
||||||
|
|
||||||
|
procedure z_fits_ushort_p_test;
|
||||||
|
procedure z_fits_sshort_p_test;
|
||||||
|
procedure z_fits_uint_p_test;
|
||||||
|
procedure z_fits_sint_p_test;
|
||||||
|
procedure z_fits_ulong_p_test;
|
||||||
|
procedure z_fits_slong_p_test;
|
||||||
|
procedure z_sizeinbase_test;
|
||||||
|
procedure z_size_test;
|
||||||
|
|
||||||
|
procedure q_init_test;
|
||||||
|
procedure q_clear_test;
|
||||||
|
procedure q_set_ui_test;
|
||||||
|
procedure q_set_si_test;
|
||||||
|
procedure q_canonicalize_test;
|
||||||
|
procedure q_set_test;
|
||||||
|
procedure q_set_z_test;
|
||||||
|
procedure q_set_str_test;
|
||||||
|
procedure q_swap_test;
|
||||||
|
|
||||||
|
procedure q_get_d_test;
|
||||||
|
procedure q_set_d_test;
|
||||||
|
procedure q_set_f_test;
|
||||||
|
procedure q_get_str_test;
|
||||||
|
|
||||||
|
procedure q_add_test;
|
||||||
|
procedure q_sub_test;
|
||||||
|
procedure q_mul_test;
|
||||||
|
procedure q_mul_2exp_test;
|
||||||
|
procedure q_div_test;
|
||||||
|
procedure q_div_2exp_test;
|
||||||
|
procedure q_neg_test;
|
||||||
|
procedure q_abs_test;
|
||||||
|
procedure q_inv_test;
|
||||||
|
|
||||||
|
procedure q_cmp_test;
|
||||||
|
procedure q_cmp_si_test;
|
||||||
|
procedure q_cmp_ui_test;
|
||||||
|
procedure q_equal_test;
|
||||||
|
|
||||||
|
procedure q_get_num_test;
|
||||||
|
procedure q_get_den_test;
|
||||||
|
procedure q_set_num_test;
|
||||||
|
procedure q_set_den_test;
|
||||||
|
|
||||||
|
procedure f_get_default_prec_test;
|
||||||
|
procedure f_set_default_prec_test;
|
||||||
|
|
||||||
|
procedure f_init_test;
|
||||||
|
procedure f_init2_test;
|
||||||
|
procedure f_clear_test;
|
||||||
|
procedure f_get_prec_test;
|
||||||
|
procedure f_set_prec_test;
|
||||||
|
procedure f_set_prec_raw_test;
|
||||||
|
|
||||||
|
procedure f_set_q_test;
|
||||||
|
procedure f_set_ui_test;
|
||||||
|
procedure f_get_ui_test;
|
||||||
|
procedure f_set_si_test;
|
||||||
|
procedure f_get_si_test;
|
||||||
|
procedure f_set_test;
|
||||||
|
procedure f_set_str_test;
|
||||||
|
procedure f_swap_test;
|
||||||
|
|
||||||
|
procedure f_get_d_test;
|
||||||
|
procedure f_set_d_test;
|
||||||
|
procedure f_set_z_test;
|
||||||
|
procedure f_get_d_2exp_test;
|
||||||
|
procedure f_get_str_test;
|
||||||
|
|
||||||
|
procedure f_add_test;
|
||||||
|
procedure f_add_ui_test;
|
||||||
|
procedure f_sub_test;
|
||||||
|
procedure f_sub_ui_test;
|
||||||
|
procedure f_ui_sub_test;
|
||||||
|
procedure f_mul_test;
|
||||||
|
procedure f_mul_ui_test;
|
||||||
|
procedure f_mul_2exp_test;
|
||||||
|
procedure f_div_test;
|
||||||
|
procedure f_div_ui_test;
|
||||||
|
procedure f_ui_div_test;
|
||||||
|
procedure f_div_2exp_test;
|
||||||
|
procedure f_sqrt_test;
|
||||||
|
procedure f_sqrt_ui_test;
|
||||||
|
procedure f_pow_ui_test;
|
||||||
|
procedure f_neg_test;
|
||||||
|
procedure f_abs_test;
|
||||||
|
|
||||||
|
procedure f_cmp_test;
|
||||||
|
procedure f_cmp_d_test;
|
||||||
|
procedure f_cmp_si_test;
|
||||||
|
procedure f_cmp_ui_test;
|
||||||
|
procedure f_eq_test;
|
||||||
|
procedure f_reldiff_test;
|
||||||
|
|
||||||
|
procedure f_ceil_test;
|
||||||
|
procedure f_floor_test;
|
||||||
|
procedure f_trunc_test;
|
||||||
|
procedure f_integer_p_test;
|
||||||
|
|
||||||
|
procedure f_fits_ushort_p_test;
|
||||||
|
procedure f_fits_sshort_p_test;
|
||||||
|
procedure f_fits_uint_p_test;
|
||||||
|
procedure f_fits_sint_p_test;
|
||||||
|
procedure f_fits_ulong_p_test;
|
||||||
|
procedure f_fits_slong_p_test;
|
||||||
|
|
||||||
|
procedure f_urandomb_test;
|
||||||
|
procedure f_random2_test;
|
||||||
|
|
||||||
|
procedure f_init_set_test;
|
||||||
|
procedure f_init_set_d_test;
|
||||||
|
procedure f_init_set_si_test;
|
||||||
|
procedure f_init_set_str_test;
|
||||||
|
procedure f_init_set_ui_test;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TTestGmpOperators }
|
||||||
|
|
||||||
|
TTestGmpOperators = class(TTestCase)
|
||||||
|
procedure star__MPFloat__MPFloat__MPFloat_;
|
||||||
|
procedure star__MPInteger__MPInteger__MPInteger_;
|
||||||
|
procedure star__MPRational__MPRational__MPRational_;
|
||||||
|
procedure pow__MPFloat_valuint_MPFloat_;
|
||||||
|
procedure pow__MPInteger_valuint_MPInteger_;
|
||||||
|
procedure plus__MPFloat__MPFloat__MPFloat_;
|
||||||
|
procedure plus__MPInteger__MPInteger__MPInteger_;
|
||||||
|
procedure plus__MPRational__MPRational__MPRational_;
|
||||||
|
procedure minus__MPFloat__MPFloat_;
|
||||||
|
procedure minus__MPInteger__MPInteger_;
|
||||||
|
procedure minus__MPRational__MPRational_;
|
||||||
|
procedure minus__MPFloat__MPFloat__MPFloat_;
|
||||||
|
procedure minus__MPInteger__MPInteger__MPInteger_;
|
||||||
|
procedure minus__MPRational__MPRational__MPRational_;
|
||||||
|
procedure slash__MPFloat__MPFloat__MPFloat_;
|
||||||
|
procedure slash__MPInteger__MPInteger__MPInteger_;
|
||||||
|
procedure slash__MPRational__MPRational__MPRational_;
|
||||||
|
procedure assign_double_MPFloat_;
|
||||||
|
procedure assign_double_MPInteger_;
|
||||||
|
procedure assign_double_MPRational_;
|
||||||
|
procedure assign__MPFloat_Cardinal;
|
||||||
|
procedure assign__MPFloat_double;
|
||||||
|
procedure assign__MPFloat_integer;
|
||||||
|
procedure assign__MPFloat_mpf_t;
|
||||||
|
procedure assign__MPFloat__MPInteger_;
|
||||||
|
procedure assign__MPFloat__MPRational_;
|
||||||
|
procedure assign__MPFloat_string;
|
||||||
|
procedure assign__MPFloat_valsint;
|
||||||
|
procedure assign__MPFloat_valuint;
|
||||||
|
procedure assign_mpf_t_MPFloat_;
|
||||||
|
procedure assign__MPInteger_cardinal;
|
||||||
|
procedure assign__MPInteger_double;
|
||||||
|
procedure assign__MPInteger_integer;
|
||||||
|
procedure assign__MPInteger__MPFloat_;
|
||||||
|
procedure assign__MPInteger__MPRational_;
|
||||||
|
procedure assign__MPInteger_mpz_t;
|
||||||
|
procedure assign__MPInteger_string;
|
||||||
|
procedure assign__MPInteger_valsint;
|
||||||
|
procedure assign__MPInteger_valuint;
|
||||||
|
procedure assign_mpq_t_MPRational_;
|
||||||
|
procedure assign__MPRandState_randstate_t;
|
||||||
|
procedure assign__MPRational_double;
|
||||||
|
procedure assign__MPRational__MPFloat_;
|
||||||
|
procedure assign__MPRational__MPInteger_;
|
||||||
|
procedure assign__MPRational_mpq_t;
|
||||||
|
procedure assign__MPRational_string;
|
||||||
|
procedure assign_mpz_t_MPInteger_;
|
||||||
|
procedure assign_randstate_t_MPRandState_;
|
||||||
|
procedure assign_string_MPFloat_;
|
||||||
|
procedure assign_string_MPInteger_;
|
||||||
|
procedure assign_string_MPRational_;
|
||||||
|
procedure assign_valsint_MPFloat_;
|
||||||
|
procedure assign_valsint_MPInteger_;
|
||||||
|
procedure assign_valsint_MPRational_;
|
||||||
|
procedure assign_valuint_MPFloat_;
|
||||||
|
procedure assign_valuint_MPInteger_;
|
||||||
|
procedure assign_valuint_MPRational_;
|
||||||
|
procedure lt__MPFloat__MPFloat_boolean;
|
||||||
|
procedure lt__MPInteger__MPInteger_boolean;
|
||||||
|
procedure lt__MPRational__MPRational_boolean;
|
||||||
|
procedure le__MPFloat__MPFloat_boolean;
|
||||||
|
procedure le__MPInteger__MPInteger_boolean;
|
||||||
|
procedure le__MPRational__MPRational_boolean;
|
||||||
|
procedure gt__MPFloat__MPFloat_boolean;
|
||||||
|
procedure gt__MPInteger__MPInteger_boolean;
|
||||||
|
procedure gt__MPRational__MPRational_boolean;
|
||||||
|
procedure ge__MPFloat__MPFloat_boolean;
|
||||||
|
procedure ge__MPInteger__MPInteger_boolean;
|
||||||
|
procedure ge__MPRational__MPRational_boolean;
|
||||||
|
end;
|
||||||
|
|
23
packages/gmp/examples/gmp_testcase.pas
Normal file
23
packages/gmp/examples/gmp_testcase.pas
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
unit gmp_testcase;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes, SysUtils, fpcunit, testregistry;
|
||||||
|
|
||||||
|
{$include gmp_test_intf}
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
math, strutils, gmp;
|
||||||
|
|
||||||
|
{$include gmp_test_impl}
|
||||||
|
|
||||||
|
initialization
|
||||||
|
RegisterTests([TTestGmpBinding, TTestGmpExtensions, TTestGmpOperators]);
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
106
packages/gmp/examples/pidigits_example.pas
Normal file
106
packages/gmp/examples/pidigits_example.pas
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
{ The Computer Language Benchmarks Game
|
||||||
|
http://shootout.alioth.debian.org
|
||||||
|
|
||||||
|
contributed by Vincent Snijders
|
||||||
|
gmp headers by Karl-Michael Schindler
|
||||||
|
}
|
||||||
|
|
||||||
|
{$mode objfpc}
|
||||||
|
|
||||||
|
program pidigits_example;
|
||||||
|
|
||||||
|
uses
|
||||||
|
gmp;
|
||||||
|
|
||||||
|
procedure PrintPiDigits(NumDigits: integer);
|
||||||
|
var
|
||||||
|
q, r, s, t: mpz_t; // Transformation matrix components.
|
||||||
|
u, v, w: mpz_t; // Temporary variables
|
||||||
|
i, k, digit, c: integer;
|
||||||
|
line: string[10];
|
||||||
|
|
||||||
|
function Extract(x:cardinal): integer;
|
||||||
|
begin
|
||||||
|
mpz_mul_ui(u, q, x);
|
||||||
|
mpz_add(u, u, r);
|
||||||
|
mpz_mul_ui(v, s, x);
|
||||||
|
mpz_add(v, v, t);
|
||||||
|
mpz_tdiv_q(w, u, v);
|
||||||
|
result := mpz_get_ui(w);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function IsSafe: boolean;
|
||||||
|
begin
|
||||||
|
result := digit = Extract(4);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Produce;
|
||||||
|
begin
|
||||||
|
mpz_mul_si(r, r, 10);
|
||||||
|
mpz_mul_si(v, t, -10 * digit);
|
||||||
|
mpz_add(r, r, v);
|
||||||
|
mpz_mul_si(q, q, 10);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Consume;
|
||||||
|
begin
|
||||||
|
inc(k);
|
||||||
|
mpz_mul_si(r, r, 2*k+1);
|
||||||
|
mpz_mul_si(u, q, 4*k+2);
|
||||||
|
mpz_add(r, r, u);
|
||||||
|
mpz_mul_si(t, t, 2*k+1);
|
||||||
|
mpz_mul_si(v, s, 4*k+2);
|
||||||
|
mpz_add(t, t, v);
|
||||||
|
mpz_mul_si(s, s, k);
|
||||||
|
mpz_mul_si(q, q, k);
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
k := 0;
|
||||||
|
i := 0;
|
||||||
|
c := 0;
|
||||||
|
setlength(line, 10);
|
||||||
|
mpz_init_set_ui(q, 1);
|
||||||
|
mpz_init_set_ui(r, 0);
|
||||||
|
mpz_init_set_ui(s, 0);
|
||||||
|
mpz_init_set_ui(t, 1);
|
||||||
|
mpz_init(u);
|
||||||
|
mpz_init(v);
|
||||||
|
mpz_init(w);
|
||||||
|
while (i < NumDigits) do begin
|
||||||
|
digit := Extract(3);
|
||||||
|
while not IsSafe do begin
|
||||||
|
Consume;
|
||||||
|
digit:= Extract(3);
|
||||||
|
end;
|
||||||
|
Produce;
|
||||||
|
inc(c);
|
||||||
|
line[c] := chr(ord('0') + digit);
|
||||||
|
inc(i);
|
||||||
|
if c = 10 then begin
|
||||||
|
writeln(line, #9':', i);
|
||||||
|
c := 0;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if c <> 0 then begin
|
||||||
|
SetLength(line, c);
|
||||||
|
writeln(line);
|
||||||
|
end;
|
||||||
|
mpz_clear(q);
|
||||||
|
mpz_clear(r);
|
||||||
|
mpz_clear(s);
|
||||||
|
mpz_clear(t);
|
||||||
|
mpz_clear(u);
|
||||||
|
mpz_clear(v);
|
||||||
|
mpz_clear(w);
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
n: integer = 27;
|
||||||
|
|
||||||
|
begin
|
||||||
|
if (ParamCount = 1) then
|
||||||
|
val(ParamStr(1), n);
|
||||||
|
PrintPiDigits(n);
|
||||||
|
end.
|
||||||
|
|
84
packages/gmp/examples/pidigits_example2.pas
Normal file
84
packages/gmp/examples/pidigits_example2.pas
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
{ The Computer Language Benchmarks Game
|
||||||
|
http://shootout.alioth.debian.org
|
||||||
|
|
||||||
|
contributed by Vincent Snijders
|
||||||
|
gmp headers by Karl-Michael Schindler
|
||||||
|
}
|
||||||
|
|
||||||
|
{$mode objfpc}
|
||||||
|
|
||||||
|
program pidigits_example2;
|
||||||
|
|
||||||
|
uses
|
||||||
|
gmp;
|
||||||
|
|
||||||
|
procedure PrintPiDigits(NumDigits: integer);
|
||||||
|
var
|
||||||
|
q, r, s, t: MPInteger; // Transformation matrix components.
|
||||||
|
i, k, digit, c: integer;
|
||||||
|
line: string[10];
|
||||||
|
|
||||||
|
function Extract(x: cardinal): integer;
|
||||||
|
begin
|
||||||
|
result := (q * x + r) / (s * x + t);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function IsSafe: boolean;
|
||||||
|
begin
|
||||||
|
result := digit = Extract(4);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Produce;
|
||||||
|
begin
|
||||||
|
r := 10 * (r - t * digit);
|
||||||
|
q *= 10;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Consume;
|
||||||
|
begin
|
||||||
|
inc(k);
|
||||||
|
r := r * (2 * k + 1) + q * (4 * k + 2);
|
||||||
|
t := t * (2 * k + 1) + s * (4 * k + 2);
|
||||||
|
s *= k;
|
||||||
|
q *= k;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
k := 0;
|
||||||
|
i := 0;
|
||||||
|
c := 0;
|
||||||
|
setlength(line, 10);
|
||||||
|
q := 1;
|
||||||
|
r := 0;
|
||||||
|
s := 0;
|
||||||
|
t := 1;
|
||||||
|
while (i < NumDigits) do begin
|
||||||
|
digit := Extract(3);
|
||||||
|
while not IsSafe do begin
|
||||||
|
Consume;
|
||||||
|
digit := Extract(3);
|
||||||
|
end;
|
||||||
|
Produce;
|
||||||
|
inc(c);
|
||||||
|
line[c] := chr(ord('0') + digit);
|
||||||
|
inc(i);
|
||||||
|
if c = 10 then begin
|
||||||
|
writeln(line, #9':', i);
|
||||||
|
c := 0;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if c <> 0 then begin
|
||||||
|
SetLength(line, c);
|
||||||
|
writeln(line);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
n: integer = 27;
|
||||||
|
|
||||||
|
begin
|
||||||
|
if (ParamCount = 1) then
|
||||||
|
val(ParamStr(1), n);
|
||||||
|
PrintPiDigits(n);
|
||||||
|
end.
|
||||||
|
|
27
packages/gmp/examples/printf_example.pas
Normal file
27
packages/gmp/examples/printf_example.pas
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
program printf_example;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
uses
|
||||||
|
math, gmp;
|
||||||
|
|
||||||
|
const
|
||||||
|
N = 2;
|
||||||
|
NBITS = 100;
|
||||||
|
|
||||||
|
var
|
||||||
|
f: mpf_t;
|
||||||
|
bits, digits: integer;
|
||||||
|
begin
|
||||||
|
mpf_init2(f, NBITS);
|
||||||
|
bits := mpf_get_prec(f);
|
||||||
|
digits := floor(bits * LOG_10_2);
|
||||||
|
mpf_sqrt_ui(f, N);
|
||||||
|
mp_printf('Sqrt(%d) to %d digits (%d bits) = %.*Fg'#10, N, digits, bits, digits, @f);
|
||||||
|
mpf_pow_ui(f, f, 2);
|
||||||
|
mp_printf('Squared back = %.*Fg'#10, digits, @f);
|
||||||
|
mpf_sub_ui(f, f, N);
|
||||||
|
mp_printf('Minus %d = %.*Fg'#10, N, digits, @f);
|
||||||
|
mpf_clear(f);
|
||||||
|
end.
|
||||||
|
|
26
packages/gmp/examples/printf_example2.pas
Normal file
26
packages/gmp/examples/printf_example2.pas
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
program printf_example2;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
uses
|
||||||
|
sysutils, math, gmp;
|
||||||
|
|
||||||
|
const
|
||||||
|
N = 2;
|
||||||
|
NBITS = 100;
|
||||||
|
|
||||||
|
var
|
||||||
|
f: mpfloat;
|
||||||
|
bits, digits: integer;
|
||||||
|
begin
|
||||||
|
f_set_default_prec(NBITS);
|
||||||
|
bits := f_get_default_prec;
|
||||||
|
digits := floor(bits * LOG_10_2);
|
||||||
|
f := f_sqrt_ui(N);
|
||||||
|
writeln(format('Sqrt(%d) to %d digits (%d bits) = %s', [N, digits, bits, string(f)]));
|
||||||
|
f := f ** 2;
|
||||||
|
writeln(format('Squared back = %s', [string(f)]));
|
||||||
|
f -= N;
|
||||||
|
writeln(format('Minus %d = %s', [N, string(f)]));
|
||||||
|
end.
|
||||||
|
|
22
packages/gmp/examples/scanf_example.pas
Normal file
22
packages/gmp/examples/scanf_example.pas
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
program scanf_example;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
uses
|
||||||
|
gmp;
|
||||||
|
|
||||||
|
var n, sqr: mpz_t;
|
||||||
|
|
||||||
|
begin
|
||||||
|
mpz_init(n);
|
||||||
|
mpz_init(sqr);
|
||||||
|
write('Please enter an integer of any length: ');
|
||||||
|
if mp_scanf('%Zd', @n) = 1 then begin
|
||||||
|
mpz_pow_ui(sqr, n, 2);
|
||||||
|
mp_printf('%Zd^2 = %Zd'#10, @n, @sqr);
|
||||||
|
end else
|
||||||
|
writeln('Failed to parse an integer from your input');
|
||||||
|
mpz_clear(sqr);
|
||||||
|
mpz_clear(n);
|
||||||
|
end.
|
||||||
|
|
21
packages/gmp/examples/scanf_example2.pas
Normal file
21
packages/gmp/examples/scanf_example2.pas
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
program scanf_example2;
|
||||||
|
|
||||||
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
|
uses
|
||||||
|
sysutils, gmp;
|
||||||
|
|
||||||
|
var
|
||||||
|
n, sqr: MPInteger;
|
||||||
|
s: string;
|
||||||
|
begin
|
||||||
|
write('Please enter an integer of any length: ');
|
||||||
|
readln(s);
|
||||||
|
z_init(n);
|
||||||
|
if mp_sscanf(pchar(s), '%Zd', n.ptr) = 1 then begin
|
||||||
|
sqr := n ** 2;
|
||||||
|
writeln(format('%s^2 = %s', [string(n), string(sqr)]));
|
||||||
|
end else
|
||||||
|
writeln('Failed to parse an integer from your input');
|
||||||
|
end.
|
||||||
|
|
83
packages/gmp/readme
Normal file
83
packages/gmp/readme
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
Readme for libgmp.tar.bz2 2009-09-06
|
||||||
|
|
||||||
|
= What
|
||||||
|
|
||||||
|
Free Pascal interface for the GNU Multiple Precision Arithmetic Library.
|
||||||
|
|
||||||
|
= Why
|
||||||
|
|
||||||
|
Numeric computing outside the built in types range. AFAIK there is no complete
|
||||||
|
binding for Free Pascal available yet.
|
||||||
|
|
||||||
|
= Files
|
||||||
|
|
||||||
|
- gmp_accept_test.pas
|
||||||
|
"Go/no go" test of the gmp unit against the GMP library on your system.
|
||||||
|
|
||||||
|
- gmp.pas
|
||||||
|
The interface unit.
|
||||||
|
|
||||||
|
- gmp_testcase.pas
|
||||||
|
Put this unit in your uses clause of a fpcunit project.
|
||||||
|
|
||||||
|
- gmp_test_impl.inc
|
||||||
|
- gmp_test_intf.inc
|
||||||
|
Test classes declarations and implementations. Included by:
|
||||||
|
* gmp_accept_test.pas
|
||||||
|
* gmp_testcase
|
||||||
|
|
||||||
|
- pidigits_example.pas
|
||||||
|
Original source from:
|
||||||
|
shootout.alioth.debian.org/u64/benchmark.php?test=pidigits&lang=fpascal&id=2
|
||||||
|
Adapted for using the gmp unit.
|
||||||
|
|
||||||
|
- pidigits_example2.pas
|
||||||
|
Modified pidigits_example.pas to demonstrate usage of the gmp extensions.
|
||||||
|
|
||||||
|
- printf_example.pas
|
||||||
|
Demo using the GMP printf
|
||||||
|
|
||||||
|
- printf_example2.pas
|
||||||
|
Dtto with gmp extensions.
|
||||||
|
|
||||||
|
- scanf_example.pas
|
||||||
|
Demo using the GMP scanf.
|
||||||
|
|
||||||
|
- scanf_example2.pas
|
||||||
|
Dtto with gmp extensions.
|
||||||
|
|
||||||
|
= Status
|
||||||
|
- Tested on 64 and 32 bit Linux and on 32 bit Windows.
|
||||||
|
- Known issues
|
||||||
|
* There is a link error on Windows with the GMP global variables.
|
||||||
|
Probably could be solved with someone's better knowledge of the Windows
|
||||||
|
environment.
|
||||||
|
|
||||||
|
= Bindings
|
||||||
|
- Standard
|
||||||
|
* Almost full (see comments in gmp.pas) binding of the types and functions
|
||||||
|
exported from libgmp.
|
||||||
|
|
||||||
|
- Extensions
|
||||||
|
* Based on pseudo value types (in fact interface types) with an automatic
|
||||||
|
memory management in the spirit of Object Pascal strings - compiler takes
|
||||||
|
care of initialization/finalization. Copy on write semantics. Can intermix
|
||||||
|
the standard binding/types with the extended ones. The extended types have
|
||||||
|
access to a same set of numeric functions as in the standard binding.
|
||||||
|
|
||||||
|
- Operators
|
||||||
|
* Overloaded operators for the extensions value types. Can make programs
|
||||||
|
significantly more readable/maintainable. See and compare for yourself
|
||||||
|
in the pidigits examples. BTW, the overhead in this example with
|
||||||
|
the extended types and operators is less than 10%. Unusable for shootout,
|
||||||
|
but is probably acceptable in many other areas.
|
||||||
|
|
||||||
|
= Tips
|
||||||
|
- range checks
|
||||||
|
You should probably want to put asserts with *_fits before conversion to
|
||||||
|
FPC ordinal types - applies to the assignment operator too.
|
||||||
|
|
||||||
|
= License
|
||||||
|
- FPC developers, you can do anything you see appropriate with the sources.
|
||||||
|
Review, refactor and/or reject :-)
|
||||||
|
|
3819
packages/gmp/src/gmp.pas
Normal file
3819
packages/gmp/src/gmp.pas
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user