1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-02 22:46:30 +02:00

Improved prime number test

This commit is contained in:
Werner Koch 1997-11-27 11:44:13 +00:00
parent 9479cf7e24
commit 649eae8f1b
10 changed files with 392 additions and 267 deletions

View file

@ -278,6 +278,37 @@ mpi_tdiv_qr( MPI quot, MPI rem, MPI num, MPI den)
mpi_free_limb_space(marker[--markidx]);
}
void
mpi_tdiv_q_2exp( MPI w, MPI u, unsigned count )
{
mpi_size_t usize, wsize;
mpi_size_t limb_cnt;
usize = u->nlimbs;
limb_cnt = count / BITS_PER_MPI_LIMB;
wsize = usize - limb_cnt;
if( limb_cnt >= usize )
w->nlimbs = 0;
else {
mpi_ptr_t wp;
mpi_ptr_t up;
RESIZE_IF_NEEDED( w, wsize );
wp = w->d;
up = u->d;
count %= BITS_PER_MPI_LIMB;
if( count ) {
mpihelp_rshift( wp, up + limb_cnt, wsize, count );
wsize -= !wp[wsize - 1];
}
else {
MPN_COPY_INCR( wp, up + limb_cnt, wsize);
}
w->nlimbs = wsize;
}
}
/****************
* Check wether dividend is divisible by divisor

View file

@ -54,6 +54,13 @@ typedef int mpi_size_t; /* (must be a signed type) */
(d)[_i] = (s)[_i]; \
} while(0)
#define MPN_COPY_INCR( d, s, n) \
do { \
mpi_size_t _i; \
for( _i = 0; _i < (n); _i++ ) \
(d)[_i] = (d)[_i]; \
} while (0)
#define MPN_COPY_DECR( d, s, n ) \
do { \
mpi_size_t _i; \

View file

@ -22,6 +22,7 @@
#include <stdio.h>
#include <stdlib.h>
#include "mpi-internal.h"
#include "longlong.h"
/****************
* Scan through an mpi and return byte for byte. a -1 is returned to indicate
@ -86,3 +87,28 @@ mpi_putbyte( MPI a, unsigned index, int c )
abort(); /* index out of range */
}
/****************
* Count the number of zerobits at the low end of A
*/
unsigned
mpi_trailing_zeros( MPI a )
{
unsigned n, count = 0;
for(n=0; n < a->nlimbs; n++ ) {
if( a->d[n] ) {
unsigned nn;
mpi_limb_t alimb = a->d[n];
count_trailing_zeros( nn, alimb );
count += nn;
break;
}
count += BITS_PER_MPI_LIMB;
}
return count;
}