1
import Base.convert, Base.promote_rule, Base.+, Base.-, Base.*, Base.<<
2
import Base.^, Base.div, Base.rem, Base.cmp, Base.sqrt
3
import Base.gcd, Base.gcdx, Base.factorial, Base.binomial
4
import Base.==, Base.<=, Base.>=, Base.<, Base.>, Base.string, Base.show
6
_jl_libgmp_wrapper = dlopen("libgmp_wrapper")
8
1
type BigInt <: Integer
11
4
function BigInt(x::String)
13
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_set_string), Void, (Ptr{Void}, Ptr{Uint8}),z,bytestring(x))
6
ccall((:jl_mpz_set_string, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Uint8}),z,bytestring(x))
15
finalizer(b, _jl_bigint_clear)
8
finalizer(b, BigInt_clear)
19
12
function BigInt(x::Int)
21
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_set_si), Void, (Ptr{Void}, Int),z,x)
14
ccall((:jl_mpz_set_si, :libgmp_wrapper), Void, (Ptr{Void}, Int),z,x)
23
finalizer(b, _jl_bigint_clear)
16
finalizer(b, BigInt_clear)
26
19
BigInt{T<:Signed}(x::T) = BigInt(int(x))
27
20
BigInt(x::Int128) = BigInt(string(x))
29
22
function BigInt(x::Uint)
31
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_set_ui), Void,
24
ccall((:jl_mpz_set_ui, :libgmp_wrapper), Void,
32
25
(Ptr{Void}, Uint), z, x)
34
finalizer(b, _jl_bigint_clear)
27
finalizer(b, BigInt_clear)
37
30
BigInt{T<:Unsigned}(x::T) = BigInt(uint(x))
81
74
promote_rule(::Type{BigInt}, ::Type{Uint128}) = BigInt
83
76
function +(x::BigInt, y::BigInt)
85
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_add), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}),z,x.mpz,y.mpz)
78
ccall((:jl_mpz_add, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}),z,x.mpz,y.mpz)
89
82
function -(x::BigInt)
91
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_neg), Void, (Ptr{Void}, Ptr{Void}),z,x.mpz)
84
ccall((:jl_mpz_neg, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Void}),z,x.mpz)
95
88
function -(x::BigInt, y::BigInt)
97
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_sub), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}),z,x.mpz,y.mpz)
90
ccall((:jl_mpz_sub, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}),z,x.mpz,y.mpz)
101
94
function *(x::BigInt, y::BigInt)
103
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_mul), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}),z,x.mpz,y.mpz)
96
ccall((:jl_mpz_mul, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}),z,x.mpz,y.mpz)
107
100
function <<(x::BigInt, c::Uint)
109
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_lshift), Void, (Ptr{Void}, Ptr{Void}, Uint), z, x.mpz, c)
102
ccall((:jl_mpz_lshift, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Void}, Uint), z, x.mpz, c)
112
105
<<(x::BigInt, c::Int32) = c<0 ? throw(DomainError()) : x<<uint(c)
113
106
<<(x::BigInt, c::Integer) = c<0 ? throw(DomainError()) : x<<uint(c)
108
function >>(x::BigInt, c::Uint)
110
ccall((:jl_mpz_rshift, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Void}, Uint), z, x.mpz, c)
113
>>(x::BigInt, c::Int32) = c<0 ? throw(DomainError()) : x>>uint(c)
114
>>(x::BigInt, c::Integer) = c<0 ? throw(DomainError()) : x>>uint(c)
115
116
function div(x::BigInt, y::BigInt)
117
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_div), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}),z,x.mpz,y.mpz)
118
ccall((:jl_mpz_div, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}),z,x.mpz,y.mpz)
121
122
function divmod(x::BigInt, y::BigInt)
122
z1= _jl_bigint_init()
123
z2= _jl_bigint_init()
124
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_divmod), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}, Ptr{Void}), z1, z2, x.mpz, y.mpz)
125
ccall((:jl_mpz_divmod, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}, Ptr{Void}), z1, z2, x.mpz, y.mpz)
125
126
BigInt(z1),BigInt(z2)
128
129
function rem(x::BigInt, y::BigInt)
130
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_rem), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}),z,x.mpz,y.mpz)
131
ccall((:jl_mpz_rem, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Void}, Ptr{Void}),z,x.mpz,y.mpz)
134
135
function cmp(x::BigInt, y::BigInt)
135
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_cmp), Int32, (Ptr{Void}, Ptr{Void}),x.mpz, y.mpz)
136
ccall((:jl_mpz_cmp, :libgmp_wrapper), Int32, (Ptr{Void}, Ptr{Void}),x.mpz, y.mpz)
138
139
function sqrt(x::BigInt)
139
z = _jl_bigint_init()
140
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_sqrt), Void, (Ptr{Void}, Ptr{Void}),z,x.mpz)
141
ccall((:jl_mpz_sqrt, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Void}),z,x.mpz)
144
145
function ^(x::BigInt, y::Uint)
145
z = _jl_bigint_init()
146
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_pow_ui), Void, (Ptr{Void}, Ptr{Void}, Uint), z, x.mpz, y)
147
ccall((:jl_mpz_pow_ui, :libgmp_wrapper), Void, (Ptr{Void}, Ptr{Void}, Uint), z, x.mpz, y)
149
150
^(x::BigInt, y::Integer) = y<0 ? throw(DomainError()) : ^(x, uint(y))
151
152
function gcd(x::BigInt, y::BigInt)
152
z = _jl_bigint_init()
153
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_gcd), Void,
154
ccall((:jl_mpz_gcd, :libgmp_wrapper), Void,
154
155
(Ptr{Void}, Ptr{Void}, Ptr{Void}), z, x.mpz, y.mpz)
158
159
function gcdx(a::BigInt, b::BigInt)
159
g = _jl_bigint_init()
160
s = _jl_bigint_init()
161
t = _jl_bigint_init()
162
ccall(dlsym(_jl_libgmp_wrapper, :_jl_mpz_gcdext), Void,
163
ccall((:jl_mpz_gcdext, :libgmp_wrapper), Void,
163
164
(Ptr{Void}, Ptr{Void}, Ptr{Void}, Ptr{Void}, Ptr{Void}),
164
165
g, s, t, a.mpz, b.mpz)
165
166
BigInt(g), BigInt(s), BigInt(t)