added libtommath-0.37
This commit is contained in:
parent
9294e79150
commit
fde740eae0
2
bn.tex
2
bn.tex
@ -49,7 +49,7 @@
|
||||
\begin{document}
|
||||
\frontmatter
|
||||
\pagestyle{empty}
|
||||
\title{LibTomMath User Manual \\ v0.36}
|
||||
\title{LibTomMath User Manual \\ v0.37}
|
||||
\author{Tom St Denis \\ tomstdenis@iahu.ca}
|
||||
\maketitle
|
||||
This text, the library and the accompanying textbook are all hereby placed in the public domain. This book has been
|
||||
|
@ -40,6 +40,9 @@ mp_add_d (mp_int * a, mp_digit b, mp_int * c)
|
||||
/* fix sign */
|
||||
a->sign = c->sign = MP_NEG;
|
||||
|
||||
/* clamp */
|
||||
mp_clamp(c);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -36,7 +36,7 @@ int mp_radix_size (mp_int * a, int radix, int *size)
|
||||
}
|
||||
|
||||
if (mp_iszero(a) == MP_YES) {
|
||||
*size = 2;
|
||||
*size = 2;
|
||||
return MP_OKAY;
|
||||
}
|
||||
|
||||
|
@ -21,6 +21,9 @@ int mp_read_radix (mp_int * a, const char *str, int radix)
|
||||
int y, res, neg;
|
||||
char ch;
|
||||
|
||||
/* zero the digit bignum */
|
||||
mp_zero(a);
|
||||
|
||||
/* make sure the radix is ok */
|
||||
if (radix < 2 || radix > 64) {
|
||||
return MP_VAL;
|
||||
|
@ -36,6 +36,10 @@ mp_sub_d (mp_int * a, mp_digit b, mp_int * c)
|
||||
a->sign = MP_ZPOS;
|
||||
res = mp_add_d(a, b, c);
|
||||
a->sign = c->sign = MP_NEG;
|
||||
|
||||
/* clamp */
|
||||
mp_clamp(c);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -27,12 +27,12 @@ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen)
|
||||
char *_s = str;
|
||||
|
||||
/* check range of the maxlen, radix */
|
||||
if (maxlen < 3 || radix < 2 || radix > 64) {
|
||||
if (maxlen < 2 || radix < 2 || radix > 64) {
|
||||
return MP_VAL;
|
||||
}
|
||||
|
||||
/* quick out if its zero */
|
||||
if (mp_iszero(a) == 1) {
|
||||
if (mp_iszero(a) == MP_YES) {
|
||||
*str++ = '0';
|
||||
*str = '\0';
|
||||
return MP_OKAY;
|
||||
@ -57,21 +57,20 @@ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen)
|
||||
|
||||
digs = 0;
|
||||
while (mp_iszero (&t) == 0) {
|
||||
if (--maxlen < 1) {
|
||||
/* no more room */
|
||||
break;
|
||||
}
|
||||
if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) {
|
||||
mp_clear (&t);
|
||||
return res;
|
||||
}
|
||||
*str++ = mp_s_rmap[d];
|
||||
++digs;
|
||||
|
||||
if (--maxlen == 1) {
|
||||
/* no more room */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* reverse the digits of the string. In this case _s points
|
||||
* to the first digit [exluding the sign] of the number]
|
||||
* to the first digit [exluding the sign] of the number
|
||||
*/
|
||||
bn_reverse ((unsigned char *)_s, digs);
|
||||
|
||||
|
@ -221,7 +221,7 @@ while (<IN>) {
|
||||
$str = "chapter eight";
|
||||
} elsif ($a == 9) {
|
||||
$str = "chapter nine";
|
||||
} elsif ($a == 2) {
|
||||
} elsif ($a == 10) {
|
||||
$str = "chapter ten";
|
||||
}
|
||||
} else {
|
||||
|
@ -1,3 +1,9 @@
|
||||
November 18th, 2005
|
||||
v0.37 -- [Don Porter] reported on a TCL list [HEY SEND ME BUGREPORTS ALREADY!!!] that mp_add_d() would compute -0 with some inputs. Fixed.
|
||||
-- [rinick@gmail.com] reported the makefile.bcc was messed up. Fixed.
|
||||
-- [Kevin Kenny] reported some issues with mp_toradix_n(). Now it doesn't require a min of 3 chars of output.
|
||||
-- Made the make command renamable. Wee
|
||||
|
||||
August 1st, 2005
|
||||
v0.36 -- LTM_PRIME_2MSB_ON was fixed and the "OFF" flag was removed.
|
||||
-- [Peter LaDow] found a typo in the XREALLOC macro
|
||||
|
19
makefile
19
makefile
@ -3,10 +3,14 @@
|
||||
#Tom St Denis
|
||||
|
||||
#version of library
|
||||
VERSION=0.36
|
||||
VERSION=0.37
|
||||
|
||||
CFLAGS += -I./ -Wall -W -Wshadow -Wsign-compare
|
||||
|
||||
ifndef MAKE
|
||||
MAKE=make
|
||||
endif
|
||||
|
||||
ifndef IGNORE_SPEED
|
||||
|
||||
#for speed
|
||||
@ -124,7 +128,7 @@ timing: $(LIBNAME)
|
||||
|
||||
# makes the LTM book DVI file, requires tetex, perl and makeindex [part of tetex I think]
|
||||
docdvi: tommath.src
|
||||
cd pics ; make
|
||||
cd pics ; MAKE=${MAKE} ${MAKE}
|
||||
echo "hello" > tommath.ind
|
||||
perl booker.pl
|
||||
latex tommath > /dev/null
|
||||
@ -141,7 +145,7 @@ poster: poster.tex
|
||||
docs: docdvi
|
||||
dvipdf tommath
|
||||
rm -f tommath.log tommath.aux tommath.dvi tommath.idx tommath.toc tommath.lof tommath.ind tommath.ilg
|
||||
cd pics ; make clean
|
||||
cd pics ; MAKE=${MAKE} ${MAKE} clean
|
||||
|
||||
#LTM user manual
|
||||
mandvi: bn.tex
|
||||
@ -161,10 +165,10 @@ pretty:
|
||||
|
||||
clean:
|
||||
rm -f *.bat *.pdf *.o *.a *.obj *.lib *.exe *.dll etclib/*.o demo/demo.o test ltmtest mpitest mtest/mtest mtest/mtest.exe \
|
||||
*.idx *.toc *.log *.aux *.dvi *.lof *.ind *.ilg *.ps *.log *.s mpi.c *.da *.dyn *.dpi tommath.tex `find -type f | grep [~] | xargs` *.lo *.la
|
||||
*.idx *.toc *.log *.aux *.dvi *.lof *.ind *.ilg *.ps *.log *.s mpi.c *.da *.dyn *.dpi tommath.tex `find . -type f | grep [~] | xargs` *.lo *.la
|
||||
rm -rf .libs
|
||||
cd etc ; make clean
|
||||
cd pics ; make clean
|
||||
cd etc ; MAKE=${MAKE} ${MAKE} clean
|
||||
cd pics ; MAKE=${MAKE} ${MAKE} clean
|
||||
|
||||
#zipup the project (take that!)
|
||||
no_oops: clean
|
||||
@ -177,4 +181,5 @@ zipup: clean manual poster docs
|
||||
cd .. ; rm -rf ltm* libtommath-$(VERSION) ; mkdir libtommath-$(VERSION) ; \
|
||||
cp -R ./libtommath/* ./libtommath-$(VERSION)/ ; \
|
||||
tar -c libtommath-$(VERSION)/* | bzip2 -9vvc > ltm-$(VERSION).tar.bz2 ; \
|
||||
zip -9 -r ltm-$(VERSION).zip libtommath-$(VERSION)/*
|
||||
zip -9 -r ltm-$(VERSION).zip libtommath-$(VERSION)/* ; \
|
||||
mv -f ltm* ~ ; rm -rf libtommath-$(VERSION)
|
||||
|
@ -39,6 +39,6 @@ TARGET = libtommath.lib
|
||||
|
||||
$(TARGET): $(OBJECTS)
|
||||
|
||||
.c.objbjbjbj:
|
||||
.c.obj:
|
||||
$(CC) $(CFLAGS) $<
|
||||
$(LIB) $(TARGET) -+$@
|
||||
|
@ -1,7 +1,7 @@
|
||||
#Makefile for GCC
|
||||
#
|
||||
#Tom St Denis
|
||||
VERSION=0:36
|
||||
VERSION=0:37
|
||||
|
||||
CC = libtool --mode=compile gcc
|
||||
|
||||
@ -80,11 +80,13 @@ bn_mp_prime_random_ex.o bn_mp_get_int.o bn_mp_sqrt.o bn_mp_is_square.o bn_mp_ini
|
||||
bn_mp_init_set_int.o bn_mp_invmod_slow.o bn_mp_prime_rabin_miller_trials.o \
|
||||
bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin_n.o
|
||||
|
||||
objs: $(OBJECTS)
|
||||
|
||||
$(LIBNAME): $(OBJECTS)
|
||||
libtool --mode=link gcc *.lo -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION)
|
||||
libtool --mode=link gcc *.o -o $(LIBNAME_S)
|
||||
ranlib $(LIBNAME_S)
|
||||
libtool --mode=install install -c $(LIBNAME) $(LIBPATH)/$@
|
||||
|
||||
install: $(LIBNAME)
|
||||
libtool --mode=install install -c $(LIBNAME) $(LIBPATH)/$(LIBNAME)
|
||||
install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH)
|
||||
install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH)
|
||||
|
||||
|
BIN
poster.pdf
BIN
poster.pdf
Binary file not shown.
@ -913,6 +913,9 @@ mp_add_d (mp_int * a, mp_digit b, mp_int * c)
|
||||
/* fix sign */
|
||||
a->sign = c->sign = MP_NEG;
|
||||
|
||||
/* clamp */
|
||||
mp_clamp(c);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -6241,7 +6244,7 @@ int mp_radix_size (mp_int * a, int radix, int *size)
|
||||
}
|
||||
|
||||
if (mp_iszero(a) == MP_YES) {
|
||||
*size = 2;
|
||||
*size = 2;
|
||||
return MP_OKAY;
|
||||
}
|
||||
|
||||
@ -6395,6 +6398,9 @@ int mp_read_radix (mp_int * a, const char *str, int radix)
|
||||
int y, res, neg;
|
||||
char ch;
|
||||
|
||||
/* zero the digit bignum */
|
||||
mp_zero(a);
|
||||
|
||||
/* make sure the radix is ok */
|
||||
if (radix < 2 || radix > 64) {
|
||||
return MP_VAL;
|
||||
@ -7562,6 +7568,10 @@ mp_sub_d (mp_int * a, mp_digit b, mp_int * c)
|
||||
a->sign = MP_ZPOS;
|
||||
res = mp_add_d(a, b, c);
|
||||
a->sign = c->sign = MP_NEG;
|
||||
|
||||
/* clamp */
|
||||
mp_clamp(c);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -8448,12 +8458,12 @@ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen)
|
||||
char *_s = str;
|
||||
|
||||
/* check range of the maxlen, radix */
|
||||
if (maxlen < 3 || radix < 2 || radix > 64) {
|
||||
if (maxlen < 2 || radix < 2 || radix > 64) {
|
||||
return MP_VAL;
|
||||
}
|
||||
|
||||
/* quick out if its zero */
|
||||
if (mp_iszero(a) == 1) {
|
||||
if (mp_iszero(a) == MP_YES) {
|
||||
*str++ = '0';
|
||||
*str = '\0';
|
||||
return MP_OKAY;
|
||||
@ -8478,21 +8488,20 @@ int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen)
|
||||
|
||||
digs = 0;
|
||||
while (mp_iszero (&t) == 0) {
|
||||
if (--maxlen < 1) {
|
||||
/* no more room */
|
||||
break;
|
||||
}
|
||||
if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) {
|
||||
mp_clear (&t);
|
||||
return res;
|
||||
}
|
||||
*str++ = mp_s_rmap[d];
|
||||
++digs;
|
||||
|
||||
if (--maxlen == 1) {
|
||||
/* no more room */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* reverse the digits of the string. In this case _s points
|
||||
* to the first digit [exluding the sign] of the number]
|
||||
* to the first digit [exluding the sign] of the number
|
||||
*/
|
||||
bn_reverse ((unsigned char *)_s, digs);
|
||||
|
||||
|
BIN
tommath.pdf
BIN
tommath.pdf
Binary file not shown.
@ -66,7 +66,7 @@ QUALCOMM Australia \\
|
||||
}
|
||||
}
|
||||
\maketitle
|
||||
This text has been placed in the public domain. This text corresponds to the v0.36 release of the
|
||||
This text has been placed in the public domain. This text corresponds to the v0.37 release of the
|
||||
LibTomMath project.
|
||||
|
||||
\begin{alltt}
|
||||
|
232
tommath.tex
232
tommath.tex
@ -66,7 +66,7 @@ QUALCOMM Australia \\
|
||||
}
|
||||
}
|
||||
\maketitle
|
||||
This text has been placed in the public domain. This text corresponds to the v0.36 release of the
|
||||
This text has been placed in the public domain. This text corresponds to the v0.37 release of the
|
||||
LibTomMath project.
|
||||
|
||||
\begin{alltt}
|
||||
@ -8808,70 +8808,73 @@ This algorithm initiates a temporary mp\_int with the value of the single digit
|
||||
039 /* fix sign */
|
||||
040 a->sign = c->sign = MP_NEG;
|
||||
041
|
||||
042 return res;
|
||||
043 \}
|
||||
042 /* clamp */
|
||||
043 mp_clamp(c);
|
||||
044
|
||||
045 /* old number of used digits in c */
|
||||
046 oldused = c->used;
|
||||
045 return res;
|
||||
046 \}
|
||||
047
|
||||
048 /* sign always positive */
|
||||
049 c->sign = MP_ZPOS;
|
||||
048 /* old number of used digits in c */
|
||||
049 oldused = c->used;
|
||||
050
|
||||
051 /* source alias */
|
||||
052 tmpa = a->dp;
|
||||
051 /* sign always positive */
|
||||
052 c->sign = MP_ZPOS;
|
||||
053
|
||||
054 /* destination alias */
|
||||
055 tmpc = c->dp;
|
||||
054 /* source alias */
|
||||
055 tmpa = a->dp;
|
||||
056
|
||||
057 /* if a is positive */
|
||||
058 if (a->sign == MP_ZPOS) \{
|
||||
059 /* add digit, after this we're propagating
|
||||
060 * the carry.
|
||||
061 */
|
||||
062 *tmpc = *tmpa++ + b;
|
||||
063 mu = *tmpc >> DIGIT_BIT;
|
||||
064 *tmpc++ &= MP_MASK;
|
||||
065
|
||||
066 /* now handle rest of the digits */
|
||||
067 for (ix = 1; ix < a->used; ix++) \{
|
||||
068 *tmpc = *tmpa++ + mu;
|
||||
069 mu = *tmpc >> DIGIT_BIT;
|
||||
070 *tmpc++ &= MP_MASK;
|
||||
071 \}
|
||||
072 /* set final carry */
|
||||
073 ix++;
|
||||
074 *tmpc++ = mu;
|
||||
075
|
||||
076 /* setup size */
|
||||
077 c->used = a->used + 1;
|
||||
078 \} else \{
|
||||
079 /* a was negative and |a| < b */
|
||||
080 c->used = 1;
|
||||
081
|
||||
082 /* the result is a single digit */
|
||||
083 if (a->used == 1) \{
|
||||
084 *tmpc++ = b - a->dp[0];
|
||||
085 \} else \{
|
||||
086 *tmpc++ = b;
|
||||
087 \}
|
||||
088
|
||||
089 /* setup count so the clearing of oldused
|
||||
090 * can fall through correctly
|
||||
091 */
|
||||
092 ix = 1;
|
||||
093 \}
|
||||
094
|
||||
095 /* now zero to oldused */
|
||||
096 while (ix++ < oldused) \{
|
||||
097 *tmpc++ = 0;
|
||||
098 \}
|
||||
099 mp_clamp(c);
|
||||
100
|
||||
101 return MP_OKAY;
|
||||
102 \}
|
||||
057 /* destination alias */
|
||||
058 tmpc = c->dp;
|
||||
059
|
||||
060 /* if a is positive */
|
||||
061 if (a->sign == MP_ZPOS) \{
|
||||
062 /* add digit, after this we're propagating
|
||||
063 * the carry.
|
||||
064 */
|
||||
065 *tmpc = *tmpa++ + b;
|
||||
066 mu = *tmpc >> DIGIT_BIT;
|
||||
067 *tmpc++ &= MP_MASK;
|
||||
068
|
||||
069 /* now handle rest of the digits */
|
||||
070 for (ix = 1; ix < a->used; ix++) \{
|
||||
071 *tmpc = *tmpa++ + mu;
|
||||
072 mu = *tmpc >> DIGIT_BIT;
|
||||
073 *tmpc++ &= MP_MASK;
|
||||
074 \}
|
||||
075 /* set final carry */
|
||||
076 ix++;
|
||||
077 *tmpc++ = mu;
|
||||
078
|
||||
079 /* setup size */
|
||||
080 c->used = a->used + 1;
|
||||
081 \} else \{
|
||||
082 /* a was negative and |a| < b */
|
||||
083 c->used = 1;
|
||||
084
|
||||
085 /* the result is a single digit */
|
||||
086 if (a->used == 1) \{
|
||||
087 *tmpc++ = b - a->dp[0];
|
||||
088 \} else \{
|
||||
089 *tmpc++ = b;
|
||||
090 \}
|
||||
091
|
||||
092 /* setup count so the clearing of oldused
|
||||
093 * can fall through correctly
|
||||
094 */
|
||||
095 ix = 1;
|
||||
096 \}
|
||||
097
|
||||
098 /* now zero to oldused */
|
||||
099 while (ix++ < oldused) \{
|
||||
100 *tmpc++ = 0;
|
||||
101 \}
|
||||
102 mp_clamp(c);
|
||||
103
|
||||
104 #endif
|
||||
105
|
||||
104 return MP_OKAY;
|
||||
105 \}
|
||||
106
|
||||
107 #endif
|
||||
108
|
||||
\end{alltt}
|
||||
\end{small}
|
||||
|
||||
@ -9481,62 +9484,65 @@ as part of larger input without any significant problem.
|
||||
020 int y, res, neg;
|
||||
021 char ch;
|
||||
022
|
||||
023 /* make sure the radix is ok */
|
||||
024 if (radix < 2 || radix > 64) \{
|
||||
025 return MP_VAL;
|
||||
026 \}
|
||||
027
|
||||
028 /* if the leading digit is a
|
||||
029 * minus set the sign to negative.
|
||||
030 */
|
||||
031 if (*str == '-') \{
|
||||
032 ++str;
|
||||
033 neg = MP_NEG;
|
||||
034 \} else \{
|
||||
035 neg = MP_ZPOS;
|
||||
036 \}
|
||||
037
|
||||
038 /* set the integer to the default of zero */
|
||||
039 mp_zero (a);
|
||||
040
|
||||
041 /* process each digit of the string */
|
||||
042 while (*str) \{
|
||||
043 /* if the radix < 36 the conversion is case insensitive
|
||||
044 * this allows numbers like 1AB and 1ab to represent the same value
|
||||
045 * [e.g. in hex]
|
||||
046 */
|
||||
047 ch = (char) ((radix < 36) ? toupper (*str) : *str);
|
||||
048 for (y = 0; y < 64; y++) \{
|
||||
049 if (ch == mp_s_rmap[y]) \{
|
||||
050 break;
|
||||
051 \}
|
||||
052 \}
|
||||
053
|
||||
054 /* if the char was found in the map
|
||||
055 * and is less than the given radix add it
|
||||
056 * to the number, otherwise exit the loop.
|
||||
057 */
|
||||
058 if (y < radix) \{
|
||||
059 if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) \{
|
||||
060 return res;
|
||||
061 \}
|
||||
062 if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) \{
|
||||
023 /* zero the digit bignum */
|
||||
024 mp_zero(a);
|
||||
025
|
||||
026 /* make sure the radix is ok */
|
||||
027 if (radix < 2 || radix > 64) \{
|
||||
028 return MP_VAL;
|
||||
029 \}
|
||||
030
|
||||
031 /* if the leading digit is a
|
||||
032 * minus set the sign to negative.
|
||||
033 */
|
||||
034 if (*str == '-') \{
|
||||
035 ++str;
|
||||
036 neg = MP_NEG;
|
||||
037 \} else \{
|
||||
038 neg = MP_ZPOS;
|
||||
039 \}
|
||||
040
|
||||
041 /* set the integer to the default of zero */
|
||||
042 mp_zero (a);
|
||||
043
|
||||
044 /* process each digit of the string */
|
||||
045 while (*str) \{
|
||||
046 /* if the radix < 36 the conversion is case insensitive
|
||||
047 * this allows numbers like 1AB and 1ab to represent the same value
|
||||
048 * [e.g. in hex]
|
||||
049 */
|
||||
050 ch = (char) ((radix < 36) ? toupper (*str) : *str);
|
||||
051 for (y = 0; y < 64; y++) \{
|
||||
052 if (ch == mp_s_rmap[y]) \{
|
||||
053 break;
|
||||
054 \}
|
||||
055 \}
|
||||
056
|
||||
057 /* if the char was found in the map
|
||||
058 * and is less than the given radix add it
|
||||
059 * to the number, otherwise exit the loop.
|
||||
060 */
|
||||
061 if (y < radix) \{
|
||||
062 if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) \{
|
||||
063 return res;
|
||||
064 \}
|
||||
065 \} else \{
|
||||
066 break;
|
||||
067 \}
|
||||
068 ++str;
|
||||
069 \}
|
||||
070
|
||||
071 /* set the sign only if a != 0 */
|
||||
072 if (mp_iszero(a) != 1) \{
|
||||
073 a->sign = neg;
|
||||
074 \}
|
||||
075 return MP_OKAY;
|
||||
076 \}
|
||||
077 #endif
|
||||
078
|
||||
065 if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) \{
|
||||
066 return res;
|
||||
067 \}
|
||||
068 \} else \{
|
||||
069 break;
|
||||
070 \}
|
||||
071 ++str;
|
||||
072 \}
|
||||
073
|
||||
074 /* set the sign only if a != 0 */
|
||||
075 if (mp_iszero(a) != 1) \{
|
||||
076 a->sign = neg;
|
||||
077 \}
|
||||
078 return MP_OKAY;
|
||||
079 \}
|
||||
080 #endif
|
||||
081
|
||||
\end{alltt}
|
||||
\end{small}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user