gmpd 0.2.17
Highlevel wrapper for GNU MP (GMP)
To use this package, run the following command in your project's root directory:
Manual usage
Put the following dependency into your project's dependences section:
gmpd
Dlanguage highlevel wrapper for GNU MP (GMP) library
that aims to be mostly
compatible with
std.bigint.BigInt
and @safe pure nothrow @nogc
except when converting to
string
.
Basics
 Integers (GMP's
mpz_t
) are wrapped ingmp.z.MpZ
 Rationals (GMP's
mpq_t
) are wrapped ingmp.q.MpQ
along with most of their common operations implemented either as member functions, free functions or both.
Sample Usage
MpZ
import gmp.z;
@safe pure nothrow @nogc:
unittest
{
alias Z = MpZ;
assert(Z.mersennePrime(15) == 2^^15  1);
const a = 42.Z;
const b = a.dup; // explicit copying required
}
MpQ
import gmp.q;
@safe pure nothrow @nogc:
unittest
{
alias Q = MpQ;
Q x = Q(4, 6);
assert(x.numerator == 4);
assert(x.denominator == 6);
x.canonicalize();
assert(x.numerator == 2);
assert(x.denominator == 3);
assert(inverse(x) == Q(3, 2));
assert(Q(1, 2) + Q(1, 3) == Q(5, 6));
}
Value passing
Value semantics with explicit copying and move
For MpZ
, copy construction is disabled by default to prevent inadvertent
copying. Instead use f(move(z))
or f(z.move)
(from std.algorithm.mutation
)
to pass by move or f(z.dup)
to pass by explicit copy (via MpZ
's member
function .dup
).
Value semantics with copyonwrite a la Phobos’ std.bigint.BigInt
Use Z
(CopyableMpZ
), for a dropinreplacement for Phobos’
std.bigint.BigInt
. For reference see
https://dlang.org/phobos/std_bigint.html#.BigInt.
Mappings to GNU MP C library
Implementation is optimized through
mapping of GMP's C macros into D inline functions that operate directly on the internal Crepresentations
__mpz_struct
and__mpq_struct
,passing of
MpZ
typed parameters asauto ref const
in combination with conditional compilation for rvalueMpZ
passed parameters via__traits(isRef)
. This enables clever reuse ofmpz_t
instances when passed to__gmpz
functions. For instance,x + 42.Z
can be lowered to
__gmpz_add(rhs._ptr, this._ptr, rhs._ptr);
return move(rhs);
in
opBinary!"+"()(auto ref const MpZ rhs)
Compilation Performance
Compilation is fast; DMD compiles gmpd
in about 0.1 seconds on a modern
machine.
Runtime Performance
Wrapper is as lightweight as possible; Some Dfunctions directly access the internal Cdatastructure exposed by the structs and macros in the Cheaders of GNU GMP.
Limitations
Note that D's __traits(isRef)
currently cannot be used to distinguish lvalue
from rvalue passing of this
. This severly limits the possibilities of using
C++style expression
templates to realize lazy
evaluation in operator overloading. If this limitation were to be fixed
(probably via some introspection mechanism other than the trait isRef
or
nonstruct
member operator overloading), this library could implement lowering
of expressions such
Z result = base^^exp % modulo
to the builtin
__gmpz_powm(result._ptr, base._ptr, expr._ptr, modulo._ptr)
See the unittests for MpzAddExpr
, MpzMulExpr
, etc for details on how this
currently can be implemented and verified (in ccc
version) with free
functions such add
and sub
.
Future
There are more mpz_t
 and mpq_t
functions that should be wrapped but these are good start.
 Registered by Per Nordlöw
 0.2.17 released 6 months ago
 nordlow/gmpd
 BSL1.0
 Per Nordlöw
 Authors:
 Dependencies:
 none
 Versions:

0.2.17 2022Dec20 0.2.16 2022Oct15 0.2.15 2022Sep12 0.2.14 2022Jul27 0.2.13 2022Jul27  Download Stats:


0 downloads today

0 downloads this week

0 downloads this month

810 downloads total

 Score:
 1.6
 Short URL:
 gmpd.dub.pm