Add annotations to gmp.c

This commit is contained in:
xiaoh105
2025-06-07 15:23:11 +08:00
parent e7bc194ec7
commit 1873d949ce
8 changed files with 448 additions and 175 deletions

View File

@ -1,14 +1,35 @@
#include "mini-gmp.h"
#include "verification_stdlib.h"
#include "verification_list.h"
#include "int_array_def.h"
mp_size_t gmp_abs(mp_size_t x) {
int gmp_abs(int x)
/*@
Require emp
Ensure __return == Zabs(x)
*/
{
return x >= 0 ? x : -x;
}
mp_size_t gmp_max(mp_size_t a, mp_size_t b) {
int gmp_max(int a, int b)
/*@
Require emp
Ensure __return == Zmax(a, b)
*/
{
return a > b ? a : b;
}
int gmp_cmp(mp_size_t a, mp_size_t b) {
int gmp_cmp(int a, int b)
/*@
Require emp
Ensure
a > b && __return == 1 ||
a == b && __return == 0 ||
a < b && __return == -1
*/
{
return (a > b) - (a < b);
}
@ -16,16 +37,42 @@ int gmp_cmp(mp_size_t a, mp_size_t b) {
/* 从 低地址向高地址 顺序复制 */
void
mpn_copyi (mp_ptr d, mp_srcptr s, mp_size_t n)
mpn_copyi (unsigned int *d, unsigned int *s, int n)
/*@
With val data cap1 cap2
Require
mpd_store_Z(s, val, n, cap1) *
store_uint_array(d, cap2, data)
Ensure
mpd_store_Z(s, val, n, cap1) *
mpd_store_Z(d, val, n, cap2)
*/
{
mp_size_t i;
/*
mpd_store_Z(s, val, n, cap1)
which implies
exists l,
store_uint_array(s, n, l) **
store_undef
*/
int i;
for (i = 0; i < n; i++)
d[i] = s[i];
}
/* 大于返回1小于返回-1等于返回0 */
int
mpn_cmp (mp_srcptr ap, mp_srcptr bp, mp_size_t n)
mpn_cmp (unsigned int *ap, unsigned int *bp, int n)
/*@
With cap1 cap2 val1 val2
Require
mpd_store_Z(ap, val1, n, cap1) **
mpd_store_Z(bp, val2, n, cap2)
Ensure
val1 > val2 && __return == 1 ||
val1 == val2 && __return == 0 ||
val1 < val2 && __return == -1
*/
{
while (--n >= 0)
{
@ -37,7 +84,7 @@ mpn_cmp (mp_srcptr ap, mp_srcptr bp, mp_size_t n)
/*处理位数不同的情况*/
static int
mpn_cmp4 (mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
mpn_cmp4 (unsigned int *ap, int an, unsigned int *bp, int bn)
{
if (an != bn)
return an < bn ? -1 : 1;
@ -46,8 +93,8 @@ mpn_cmp4 (mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
}
/*返回非0的位数*/
static mp_size_t
mpn_normalized_size (mp_srcptr xp, mp_size_t n)
static int
mpn_normalized_size (unsigned int *xp, int n)
{
while (n > 0 && xp[n-1] == 0)
--n;
@ -55,15 +102,15 @@ mpn_normalized_size (mp_srcptr xp, mp_size_t n)
}
/* 多精度数ap 加上单精度数b返回最后产生的进位 */
mp_limb_t
mpn_add_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
unsigned int
mpn_add_1 (unsigned int *rp, unsigned int *ap, int n, unsigned int b)
{
mp_size_t i;
int i;
//assert (n > 0);
i = 0;
do
{
mp_limb_t r = ap[i] + b;
unsigned int r = ap[i] + b;
/* Carry out */
b = (r < b);
rp[i] = r;
@ -74,15 +121,15 @@ mpn_add_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
}
/* 位数相同的多精度数ap 加上多精度数bp返回最后产生的进位 */
mp_limb_t
mpn_add_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
unsigned int
mpn_add_n (unsigned int *rp, unsigned int *ap, unsigned int *bp, int n)
{
mp_size_t i;
mp_limb_t cy;
int i;
unsigned int cy;
for (i = 0, cy = 0; i < n; i++)
{
mp_limb_t a, b, r;
unsigned int a, b, r;
a = ap[i]; b = bp[i];
r = a + cy;
cy = (r < cy);
@ -94,10 +141,10 @@ mpn_add_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
}
/*不同位数的多精度数相加,返回最后的进位*/
mp_limb_t
mpn_add (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
unsigned int
mpn_add (unsigned int *rp, unsigned int *ap, int an, unsigned int *bp, int bn)
{
mp_limb_t cy;
unsigned int cy;
//assert (an >= bn);
cy = mpn_add_n (rp, ap, bp, bn);
if (an > bn)
@ -105,17 +152,17 @@ mpn_add (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
return cy;
}
mp_limb_t
mpn_sub_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
unsigned int
mpn_sub_1 (unsigned int *rp, unsigned int *ap, int n, unsigned int b)
{
mp_size_t i;
int i;
//assert (n > 0);
i = 0;
do
{
mp_limb_t a = ap[i];
unsigned int a = ap[i];
/* Carry out */
mp_limb_t cy = a < b;
unsigned int cy = a < b;
rp[i] = a - b;
b = cy;
}
@ -124,15 +171,15 @@ mpn_sub_1 (mp_ptr rp, mp_srcptr ap, mp_size_t n, mp_limb_t b)
return b;
}
mp_limb_t
mpn_sub_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
unsigned int
mpn_sub_n (unsigned int *rp, unsigned int *ap, unsigned int *bp, int n)
{
mp_size_t i;
mp_limb_t cy;
int i;
unsigned int cy;
for (i = 0, cy = 0; i < n; i++)
{
mp_limb_t a, b;
unsigned int a, b;
a = ap[i]; b = bp[i];
b += cy;
cy = (b < cy);
@ -142,10 +189,10 @@ mpn_sub_n (mp_ptr rp, mp_srcptr ap, mp_srcptr bp, mp_size_t n)
return cy;
}
mp_limb_t
mpn_sub (mp_ptr rp, mp_srcptr ap, mp_size_t an, mp_srcptr bp, mp_size_t bn)
unsigned int
mpn_sub (unsigned int *rp, unsigned int *ap, int an, unsigned int *bp, int bn)
{
mp_limb_t cy;
unsigned int cy;
//assert (an >= bn);
cy = mpn_sub_n (rp, ap, bp, bn);
if (an > bn)
@ -162,8 +209,8 @@ mpz_clear (mpz_t r)
gmp_free_limbs (r->_mp_d, r->_mp_alloc);
}
static mp_ptr
mpz_realloc (mpz_t r, mp_size_t size)
static unsigned int *
mpz_realloc (mpz_t r, int size)
{
size = gmp_max (size, 1);
@ -180,7 +227,7 @@ mpz_realloc (mpz_t r, mp_size_t size)
}
/* Realloc for an mpz_t WHAT if it has less than NEEDED limbs. */
mp_ptr mrz_realloc_if(mpz_t z,mp_size_t n) {
unsigned int *mrz_realloc_if(mpz_t z,int n) {
return n > z->_mp_alloc ? mpz_realloc(z, n) : z->_mp_d;
}
@ -194,25 +241,25 @@ mpz_sgn (const mpz_t u)
void
mpz_swap (mpz_t u, mpz_t v)
{
mp_size_t_swap (u->_mp_alloc, v->_mp_alloc);
mp_ptr_swap(u->_mp_d, v->_mp_d);
mp_size_t_swap (u->_mp_size, v->_mp_size);
int_swap (u->_mp_alloc, v->_mp_alloc);
unsigned int *_swap(u->_mp_d, v->_mp_d);
int_swap (u->_mp_size, v->_mp_size);
}
/* MPZ addition and subtraction */
static mp_size_t
static int
mpz_abs_add (mpz_t r, const mpz_t a, const mpz_t b)
{
mp_size_t an = gmp_abs (a->_mp_size);
mp_size_t bn = gmp_abs (b->_mp_size);
mp_ptr rp;
mp_limb_t cy;
int an = gmp_abs (a->_mp_size);
int bn = gmp_abs (b->_mp_size);
unsigned int *rp;
unsigned int cy;
if (an < bn)
{
mpz_srcptr_swap (a, b);
mp_size_t_swap (an, bn);
int_swap (an, bn);
}
rp = mrz_realloc_if (r, an + 1);
@ -223,13 +270,13 @@ mpz_abs_add (mpz_t r, const mpz_t a, const mpz_t b)
return an + cy;
}
static mp_size_t
static int
mpz_abs_sub (mpz_t r, const mpz_t a, const mpz_t b)
{
mp_size_t an = gmp_abs (a->_mp_size);
mp_size_t bn = gmp_abs (b->_mp_size);
int an = gmp_abs (a->_mp_size);
int bn = gmp_abs (b->_mp_size);
int cmp;
mp_ptr rp;
unsigned int *rp;
cmp = mpn_cmp4 (a->_mp_d, an, b->_mp_d, bn);
if (cmp > 0)
@ -251,7 +298,7 @@ mpz_abs_sub (mpz_t r, const mpz_t a, const mpz_t b)
void
mpz_add (mpz_t r, const mpz_t a, const mpz_t b)
{
mp_size_t rn;
int rn;
if ( (a->_mp_size ^ b->_mp_size) >= 0)
rn = mpz_abs_add (r, a, b);
@ -264,7 +311,7 @@ mpz_add (mpz_t r, const mpz_t a, const mpz_t b)
void
mpz_sub (mpz_t r, const mpz_t a, const mpz_t b)
{
mp_size_t rn;
int rn;
if ( (a->_mp_size ^ b->_mp_size) >= 0)
rn = mpz_abs_sub (r, a, b);