our
$VERSION
= 0.004_000;
our
@EXPORT
=
qw(
gmp_init gmp_init_set_unsigned_integer gmp_init_set_signed_integer
gmp_set gmp_set_unsigned_integer gmp_set_signed_integer gmp_set_number gmp_set_string
gmp_get_unsigned_integer gmp_get_signed_integer gmp_get_number gmp_get_string
gmp_add gmp_sub gmp_mul gmp_mul_unsigned_integer gmp_mul_signed_integer gmp_sub_mul_unsigned_integer gmp_add_mul_unsigned_integer gmp_neg
gmp_div_truncate_quotient
gmp_cmp
)
;
our
hashref
$properties
= {};
sub
gmp_init {
{
my
void
$RETURN_TYPE
};
return
;
}
sub
gmp_init_set_unsigned_integer {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
unsigned_integer
$op
) =
@ARG
;
$rop
->bzero();
$rop
->badd(
$op
);
return
;
}
sub
gmp_init_set_signed_integer {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
integer
$op
) =
@ARG
;
$rop
->bzero();
$rop
->badd(
$op
);
return
;
}
sub
gmp_set {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
gmp_integer
$op
) =
@ARG
;
$rop
->bzero();
$rop
->badd(
$op
);
return
;
}
sub
gmp_set_unsigned_integer {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
unsigned_integer
$op
) =
@ARG
;
$rop
->bzero();
$rop
->badd(
$op
);
return
;
}
sub
gmp_set_signed_integer {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
integer
$op
) =
@ARG
;
$rop
->bzero();
$rop
->badd(
$op
);
return
;
}
sub
gmp_set_number {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
number
$op
) =
@ARG
;
$rop
->bzero();
$rop
->badd(
$op
);
return
;
}
sub
gmp_set_string {
{
my
integer
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
string
$str
) =
@ARG
;
my
Math::BigInt
$tmp
= Math::BigInt->new(
$str
);
$rop
->bzero();
$rop
->badd(
$tmp
);
return
;
}
sub
gmp_get_unsigned_integer {
{
my
unsigned_integer
$RETURN_TYPE
};
(
my
gmp_integer
$op
) =
@ARG
;
return
$op
->numify();
}
sub
gmp_get_signed_integer {
{
my
integer
$RETURN_TYPE
};
(
my
gmp_integer
$op
) =
@ARG
;
return
$op
->numify();
}
sub
gmp_get_number {
{
my
integer
$RETURN_TYPE
};
(
my
gmp_integer
$op
) =
@ARG
;
return
$op
->numify();
}
sub
gmp_get_string {
{
my
string
$RETURN_TYPE
};
(
my
gmp_integer
$op
) =
@ARG
;
return
$op
->bstr();
}
sub
gmp_add {
{
my
gmp_integer
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
gmp_integer
$op1
,
my
gmp_integer
$op2
) =
@ARG
;
my
gmp_integer
$op1_copy
=
$op1
->copy();
my
gmp_integer
$op2_copy
=
$op2
->copy();
$rop
->bzero();
$rop
->badd(
$op1_copy
);
$rop
->badd(
$op2_copy
);
return
;
}
sub
gmp_sub {
{
my
gmp_integer
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
gmp_integer
$op1
,
my
gmp_integer
$op2
) =
@ARG
;
my
gmp_integer
$op1_copy
=
$op1
->copy();
my
gmp_integer
$op2_copy
=
$op2
->copy();
$rop
->bzero();
$rop
->badd(
$op1_copy
);
$rop
->bsub(
$op2_copy
);
return
;
}
sub
gmp_mul {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
gmp_integer
$op1
,
my
gmp_integer
$op2
) =
@ARG
;
my
gmp_integer
$op1_copy
=
$op1
->copy();
$rop
->bzero();
$rop
->badd(
$op1_copy
);
$rop
->bmul(
$op2
);
return
;
}
sub
gmp_mul_unsigned_integer {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
gmp_integer
$op1
,
my
unsigned_integer
$op2
) =
@ARG
;
my
gmp_integer
$op1_copy
=
$op1
->copy();
$rop
->bzero();
$rop
->badd(
$op1_copy
);
$rop
->bmul(
$op2
);
return
;
}
sub
gmp_mul_signed_integer {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
gmp_integer
$op1
,
my
integer
$op2
) =
@ARG
;
my
gmp_integer
$op1_copy
=
$op1
->copy();
$rop
->bzero();
$rop
->badd(
$op1_copy
);
$rop
->bmul(
$op2
);
return
;
}
sub
gmp_sub_mul_unsigned_integer {
{
my
gmp_integer
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
gmp_integer
$op1
,
my
unsigned_integer
$op2
) =
@ARG
;
my
gmp_integer
$op1_copy
=
$op1
->copy();
$op1_copy
->bmul(
$op2
);
$rop
->bsub(
$op1_copy
);
return
;
}
sub
gmp_add_mul_unsigned_integer {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
gmp_integer
$op1
,
my
unsigned_integer
$op2
) =
@ARG
;
my
gmp_integer
$op1_copy
=
$op1
->copy();
$op1_copy
->bmul(
$op2
);
$rop
->badd(
$op1_copy
);
return
;
}
sub
gmp_neg {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$rop
,
my
gmp_integer
$op1
) =
@ARG
;
my
gmp_integer
$op1_copy
=
$op1
->copy();
$rop
->bzero();
$rop
->badd(
$op1_copy
);
$rop
->bmul(Math::BigInt->bone(
'-'
));
return
;
}
sub
gmp_div_truncate_quotient {
{
my
void
$RETURN_TYPE
};
(
my
gmp_integer
$q
,
my
gmp_integer
$n
,
my
gmp_integer
$d
) =
@ARG
;
my
gmp_integer
$n_copy
=
$n
->copy();
my
gmp_integer
$d_copy
=
$d
->copy();
$q
->bzero();
$q
->badd(
$n_copy
);
$q
->bdiv(
$d_copy
);
return
;
}
sub
gmp_cmp {
{
my
integer
$RETURN_TYPE
};
(
my
gmp_integer
$op1
,
my
gmp_integer
$op2
) =
@ARG
;
return
$op1
->bcmp(
$op2
);
}
1;