added samples/uint.cpp samples/int.cpp samples/Makefile
changed Int::Div -- a remainder is not returning now but taking as a parameter (a pointer or reference) changed order in parameters in UInt::AddTwoInts added Int::AddInt added Int::AddTwoInts added Int::SubInt changed Int::AddOne and Int::SubOne (much faster now) fixed a bug in UInt::operator--() and Int::operator--() (there was adding instead of subtracting) git-svn-id: svn://ttmath.org/publicrep/ttmath/trunk@13 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
parent
b59de36095
commit
b4bf76065c
|
@ -0,0 +1,30 @@
|
||||||
|
CC = g++
|
||||||
|
CFLAGS = -Wall -pedantic -s -O2 -I..
|
||||||
|
|
||||||
|
|
||||||
|
.SUFFIXES: .cpp .o
|
||||||
|
|
||||||
|
.cpp.o:
|
||||||
|
$(CC) -c $(CFLAGS) $<
|
||||||
|
|
||||||
|
|
||||||
|
all: uint int
|
||||||
|
|
||||||
|
|
||||||
|
uint: uint.o
|
||||||
|
$(CC) -o uint $(CFLAGS) uint.o
|
||||||
|
|
||||||
|
int: int.o
|
||||||
|
$(CC) -o int $(CFLAGS) int.o
|
||||||
|
|
||||||
|
|
||||||
|
uint.o: uint.cpp
|
||||||
|
int.o: int.cpp
|
||||||
|
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o
|
||||||
|
rm -f *.s
|
||||||
|
rm -f uint
|
||||||
|
rm -f int
|
||||||
|
rm -f *.exe
|
|
@ -0,0 +1,90 @@
|
||||||
|
#include <ttmath/ttmathint.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
void SimpleCalculating(const ttmath::Int<2> & a, const ttmath::Int<2> & b)
|
||||||
|
{
|
||||||
|
std::cout << "Simple calculating" << std::endl;
|
||||||
|
std::cout << "a = " << a << std::endl;
|
||||||
|
std::cout << "b = " << b << std::endl;
|
||||||
|
std::cout << "a + b = " << a+b << std::endl;
|
||||||
|
std::cout << "a - b = " << a-b << std::endl;
|
||||||
|
std::cout << "a * b = " << a*b << std::endl;
|
||||||
|
std::cout << "a / b = " << a/b << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CalculatingWithCarry(const ttmath::Int<2> & a, const ttmath::Int<2> & b)
|
||||||
|
{
|
||||||
|
ttmath::Int<2> atemp;
|
||||||
|
|
||||||
|
std::cout << "Calculating with carry" << std::endl;
|
||||||
|
std::cout << "a = " << a << std::endl;
|
||||||
|
std::cout << "b = " << b << std::endl;
|
||||||
|
|
||||||
|
atemp = a;
|
||||||
|
if( !atemp.Add(b) )
|
||||||
|
std::cout << "a + b = " << atemp << std::endl;
|
||||||
|
else
|
||||||
|
std::cout << "a + b = (carry: the result is too big) " << atemp << std::endl;
|
||||||
|
|
||||||
|
atemp = a;
|
||||||
|
if( !atemp.Sub(b) )
|
||||||
|
std::cout << "a - b = " << atemp << std::endl;
|
||||||
|
else
|
||||||
|
std::cout << "a - b = (carry: 'a' was smaller than 'b') " << atemp << std::endl;
|
||||||
|
|
||||||
|
atemp = a;
|
||||||
|
if( !atemp.Mul(b) )
|
||||||
|
std::cout << "a * b = " << atemp << std::endl;
|
||||||
|
else
|
||||||
|
std::cout << "a * b = (carry: the result is too big) " << std::endl;
|
||||||
|
// it have no sense to print 'atemp' (it's undefined)
|
||||||
|
|
||||||
|
atemp = a;
|
||||||
|
if( !atemp.Div(b) )
|
||||||
|
std::cout << "a / b = " << atemp << std::endl;
|
||||||
|
else
|
||||||
|
std::cout << "a / b = (division by zero) " << std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// on 32bit platforms: 'a' and 'b' have 2-words (two 32bit words)
|
||||||
|
// in other words a,b are from <-2^63, 2^63 - 1>
|
||||||
|
ttmath::Int<2> a,b;
|
||||||
|
|
||||||
|
// conversion from 'const char *'
|
||||||
|
a = "123456";
|
||||||
|
b = "98767878";
|
||||||
|
|
||||||
|
SimpleCalculating(a,b);
|
||||||
|
|
||||||
|
// 'a' will have the max value which can be held in this type
|
||||||
|
a.SetMaxValue();
|
||||||
|
|
||||||
|
// conversion from 'int'
|
||||||
|
b = 10;
|
||||||
|
|
||||||
|
CalculatingWithCarry(a,b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
the result:
|
||||||
|
|
||||||
|
Simple calculating
|
||||||
|
a = 123456
|
||||||
|
b = 98767878
|
||||||
|
a + b = 98891334
|
||||||
|
a - b = -98644422
|
||||||
|
a * b = 12193487146368
|
||||||
|
a / b = 0
|
||||||
|
Calculating with carry
|
||||||
|
a = 9223372036854775807
|
||||||
|
b = 10
|
||||||
|
a + b = (carry: the result is too big) -9223372036854775799
|
||||||
|
a - b = 9223372036854775797
|
||||||
|
a * b = (carry: the result is too big)
|
||||||
|
a / b = 922337203685477580
|
||||||
|
*/
|
|
@ -0,0 +1,91 @@
|
||||||
|
#include <ttmath/ttmathuint.h>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
void SimpleCalculating(const ttmath::UInt<2> & a, const ttmath::UInt<2> & b)
|
||||||
|
{
|
||||||
|
std::cout << "Simple calculating" << std::endl;
|
||||||
|
std::cout << "a = " << a << std::endl;
|
||||||
|
std::cout << "b = " << b << std::endl;
|
||||||
|
std::cout << "a + b = " << a+b << std::endl;
|
||||||
|
std::cout << "a - b = " << a-b << std::endl;
|
||||||
|
std::cout << "a * b = " << a*b << std::endl;
|
||||||
|
std::cout << "a / b = " << a/b << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CalculatingWithCarry(const ttmath::UInt<2> & a, const ttmath::UInt<2> & b)
|
||||||
|
{
|
||||||
|
ttmath::UInt<2> atemp;
|
||||||
|
|
||||||
|
std::cout << "Calculating with carry" << std::endl;
|
||||||
|
std::cout << "a = " << a << std::endl;
|
||||||
|
std::cout << "b = " << b << std::endl;
|
||||||
|
|
||||||
|
atemp = a;
|
||||||
|
if( !atemp.Add(b) )
|
||||||
|
std::cout << "a + b = " << atemp << std::endl;
|
||||||
|
else
|
||||||
|
// if there was a carry then atemp.Add(...) would have returned 1
|
||||||
|
std::cout << "a + b = (carry: the result is too big) " << atemp << std::endl;
|
||||||
|
|
||||||
|
atemp = a;
|
||||||
|
if( !atemp.Sub(b) )
|
||||||
|
std::cout << "a - b = " << atemp << std::endl;
|
||||||
|
else
|
||||||
|
std::cout << "a - b = (carry: 'a' was smaller than 'b') " << atemp << std::endl;
|
||||||
|
|
||||||
|
atemp = a;
|
||||||
|
if( !atemp.Mul(b) )
|
||||||
|
std::cout << "a * b = " << atemp << std::endl;
|
||||||
|
else
|
||||||
|
std::cout << "a * b = (carry: the result is too big) " << std::endl;
|
||||||
|
// it have no sense to print 'atemp' (it's undefined)
|
||||||
|
|
||||||
|
atemp = a;
|
||||||
|
if( !atemp.Div(b) )
|
||||||
|
std::cout << "a / b = " << atemp << std::endl;
|
||||||
|
else
|
||||||
|
std::cout << "a / b = (division by zero) " << std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// on 32bit platforms: 'a' and 'b' have 2-words (two 32bit words)
|
||||||
|
// in other words a,b are from <0, 2^64 - 1>
|
||||||
|
ttmath::UInt<2> a,b;
|
||||||
|
|
||||||
|
// conversion from 'const char *'
|
||||||
|
a = "123456";
|
||||||
|
b = "9876";
|
||||||
|
|
||||||
|
SimpleCalculating(a,b);
|
||||||
|
|
||||||
|
// 'a' will have the max value which can be held in this type
|
||||||
|
a.SetMaxValue();
|
||||||
|
|
||||||
|
// conversion from 'int'
|
||||||
|
b = 5;
|
||||||
|
|
||||||
|
CalculatingWithCarry(a,b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
the result:
|
||||||
|
|
||||||
|
Simple calculating
|
||||||
|
a = 123456
|
||||||
|
b = 9876
|
||||||
|
a + b = 133332
|
||||||
|
a - b = 113580
|
||||||
|
a * b = 1219251456
|
||||||
|
a / b = 12
|
||||||
|
Calculating with carry
|
||||||
|
a = 18446744073709551615
|
||||||
|
b = 5
|
||||||
|
a + b = (carry: the result is too big) 4
|
||||||
|
a - b = 18446744073709551610
|
||||||
|
a * b = (carry: the result is too big)
|
||||||
|
a / b = 3689348814741910323
|
||||||
|
*/
|
|
@ -52,9 +52,11 @@ namespace ttmath
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief it implements the big integer value with the sign
|
\brief it implements a big integer value with a sign
|
||||||
|
|
||||||
value_size - how many bytes specify our value (value_size = 1 -> 4 bytes -> 32 bits)
|
value_size - how many bytes specify our value
|
||||||
|
on 32bit platforms: value_size=1 -> 4 bytes -> 32 bits
|
||||||
|
on 64bit platforms: value_size=1 -> 8 bytes -> 64 bits
|
||||||
value_size = 1,2,3,4,5,6....
|
value_size = 1,2,3,4,5,6....
|
||||||
*/
|
*/
|
||||||
template<uint value_size>
|
template<uint value_size>
|
||||||
|
@ -161,7 +163,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
it returns the absolute value
|
it sets an absolute value
|
||||||
|
|
||||||
it can return carry (1) (look on ChangeSign() for details)
|
it can return carry (1) (look on ChangeSign() for details)
|
||||||
*/
|
*/
|
||||||
|
@ -182,8 +184,30 @@ public:
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
uint CorrectCarryAfterAdding(bool p1_is_sign, bool p2_is_sign)
|
||||||
|
{
|
||||||
|
if( !p1_is_sign && !p2_is_sign )
|
||||||
|
{
|
||||||
|
if( UInt<value_size>::IsTheHighestBitSet() )
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( p1_is_sign && p2_is_sign )
|
||||||
|
{
|
||||||
|
if( ! UInt<value_size>::IsTheHighestBitSet() )
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
this method adds two value with sign and returns carry
|
this method adds two value with a sign and returns carry
|
||||||
|
|
||||||
we're using methods from the base class because values are stored with U2
|
we're using methods from the base class because values are stored with U2
|
||||||
we must only make the carry correction
|
we must only make the carry correction
|
||||||
|
@ -202,13 +226,55 @@ public:
|
||||||
|
|
||||||
UInt<value_size>::Add(ss2);
|
UInt<value_size>::Add(ss2);
|
||||||
|
|
||||||
if( !p1_is_sign && !p2_is_sign )
|
return CorrectCarryAfterAdding(p1_is_sign, p2_is_sign);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method adds one *unsigned* word (at a specific position)
|
||||||
|
and returns a carry (if it was)
|
||||||
|
|
||||||
|
look at a description in UInt<>::AddInt(...)
|
||||||
|
*/
|
||||||
|
uint AddInt(uint value, uint index = 0)
|
||||||
|
{
|
||||||
|
bool p1_is_sign = IsSign();
|
||||||
|
|
||||||
|
UInt<value_size>::AddInt(value, index);
|
||||||
|
|
||||||
|
return CorrectCarryAfterAdding(p1_is_sign, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
this method adds two *unsigned* words to the existing value
|
||||||
|
and these words begin on the 'index' position
|
||||||
|
|
||||||
|
index should be equal or smaller than value_size-2 (index <= value_size-2)
|
||||||
|
x1 - lower word, x2 - higher word
|
||||||
|
|
||||||
|
look at a description in UInt<>::AddTwoInts(...)
|
||||||
|
*/
|
||||||
|
uint AddTwoInts(uint x2, uint x1, uint index)
|
||||||
|
{
|
||||||
|
bool p1_is_sign = IsSign();
|
||||||
|
|
||||||
|
UInt<value_size>::AddTwoInts(x2, x1, index);
|
||||||
|
|
||||||
|
return CorrectCarryAfterAdding(p1_is_sign, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
uint CorrectCarryAfterSubtracting(bool p1_is_sign, bool p2_is_sign)
|
||||||
|
{
|
||||||
|
if( !p1_is_sign && p2_is_sign )
|
||||||
{
|
{
|
||||||
if( UInt<value_size>::IsTheHighestBitSet() )
|
if( UInt<value_size>::IsTheHighestBitSet() )
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( p1_is_sign && p2_is_sign )
|
if( p1_is_sign && !p2_is_sign )
|
||||||
{
|
{
|
||||||
if( ! UInt<value_size>::IsTheHighestBitSet() )
|
if( ! UInt<value_size>::IsTheHighestBitSet() )
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -217,9 +283,10 @@ public:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
this method subtracts two values with the sign
|
this method subtracts two values with a sign
|
||||||
|
|
||||||
we don't use the previous Add because the method ChangeSign can
|
we don't use the previous Add because the method ChangeSign can
|
||||||
sometimes return carry
|
sometimes return carry
|
||||||
|
@ -238,19 +305,21 @@ public:
|
||||||
|
|
||||||
UInt<value_size>::Sub(ss2);
|
UInt<value_size>::Sub(ss2);
|
||||||
|
|
||||||
if( !p1_is_sign && p2_is_sign )
|
return CorrectCarryAfterSubtracting(p1_is_sign, p2_is_sign);
|
||||||
{
|
}
|
||||||
if( UInt<value_size>::IsTheHighestBitSet() )
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( p1_is_sign && !p2_is_sign )
|
|
||||||
{
|
|
||||||
if( ! UInt<value_size>::IsTheHighestBitSet() )
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
/*!
|
||||||
|
this method subtracts one *unsigned* word (at a specific position)
|
||||||
|
and returns a carry (if it was)
|
||||||
|
*/
|
||||||
|
uint SubInt(uint value, uint index = 0)
|
||||||
|
{
|
||||||
|
bool p1_is_sign = IsSign();
|
||||||
|
|
||||||
|
UInt<value_size>::SubInt(value, index);
|
||||||
|
|
||||||
|
return CorrectCarryAfterSubtracting(p1_is_sign, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -259,11 +328,11 @@ public:
|
||||||
*/
|
*/
|
||||||
uint AddOne()
|
uint AddOne()
|
||||||
{
|
{
|
||||||
Int<value_size> temp;
|
bool p1_is_sign = IsSign();
|
||||||
|
|
||||||
temp.SetOne();
|
UInt<value_size>::AddOne();
|
||||||
|
|
||||||
return Add(temp);
|
return CorrectCarryAfterAdding(p1_is_sign, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -272,11 +341,11 @@ public:
|
||||||
*/
|
*/
|
||||||
uint SubOne()
|
uint SubOne()
|
||||||
{
|
{
|
||||||
Int<value_size> temp;
|
bool p1_is_sign = IsSign();
|
||||||
|
|
||||||
temp.SetOne();
|
UInt<value_size>::SubOne();
|
||||||
|
|
||||||
return Sub(temp);
|
return CorrectCarryAfterSubtracting(p1_is_sign, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -308,11 +377,11 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
we have to examine the sign of result now
|
we have to examine the sign of the result now
|
||||||
but if the result is with the sign then:
|
but if the result is with the sign then:
|
||||||
1. if the signs were the same that means the result is too big
|
1. if the signs were the same that means the result is too big
|
||||||
(the result must be without a sign)
|
(the result must be without a sign)
|
||||||
2. if the signs were diffrent that means if the result
|
2. if the signs were different that means if the result
|
||||||
is different from that one which has been returned from SetMinValue()
|
is different from that one which has been returned from SetMinValue()
|
||||||
that is carry (result too big) but if the result is equal SetMinValue()
|
that is carry (result too big) but if the result is equal SetMinValue()
|
||||||
there'll be ok (and the next SetSign will has no effect because
|
there'll be ok (and the next SetSign will has no effect because
|
||||||
|
@ -324,7 +393,7 @@ public:
|
||||||
/*
|
/*
|
||||||
there can be one case where signs are different and
|
there can be one case where signs are different and
|
||||||
the result will be equal the value from SetMinValue()
|
the result will be equal the value from SetMinValue()
|
||||||
(there is ok situation)
|
(this situation is ok)
|
||||||
*/
|
*/
|
||||||
if( ss1_is_sign != ss2_is_sign )
|
if( ss1_is_sign != ss2_is_sign )
|
||||||
{
|
{
|
||||||
|
@ -356,20 +425,21 @@ public:
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
division this = this / ss2
|
division this = this / ss2
|
||||||
function returns the remainder
|
returned values:
|
||||||
|
0 - ok
|
||||||
|
1 - division by zero
|
||||||
|
|
||||||
for example: (result means this)
|
for example: (result means 'this')
|
||||||
20 / 3 --> result: 6 remainder: 2
|
20 / 3 --> result: 6 remainder: 2
|
||||||
-20 / 3 --> result: -6 remainder: -2
|
-20 / 3 --> result: -6 remainder: -2
|
||||||
20 / -3 --> result: -6 remainder: 2
|
20 / -3 --> result: -6 remainder: 2
|
||||||
-20 / -3 --> result: 6 remainder: -2
|
-20 / -3 --> result: 6 remainder: -2
|
||||||
|
|
||||||
in other words: this(old) = result * this(new) + remainder
|
in other words: this(old) = ss2 * this(new)(result) + remainder
|
||||||
*/
|
*/
|
||||||
Int<value_size> Div(Int<value_size> ss2)
|
uint Div(Int<value_size> ss2, Int<value_size> * remainder = 0)
|
||||||
{
|
{
|
||||||
bool ss1_is_sign, ss2_is_sign;
|
bool ss1_is_sign, ss2_is_sign;
|
||||||
Int<value_size> remainder;
|
|
||||||
|
|
||||||
ss1_is_sign = IsSign();
|
ss1_is_sign = IsSign();
|
||||||
ss2_is_sign = ss2.IsSign();
|
ss2_is_sign = ss2.IsSign();
|
||||||
|
@ -380,17 +450,21 @@ public:
|
||||||
Abs();
|
Abs();
|
||||||
ss2.Abs();
|
ss2.Abs();
|
||||||
|
|
||||||
remainder = UInt<value_size>::Div(ss2);
|
uint c = UInt<value_size>::Div(ss2, remainder);
|
||||||
|
|
||||||
if( ss1_is_sign != ss2_is_sign )
|
if( ss1_is_sign != ss2_is_sign )
|
||||||
SetSign();
|
SetSign();
|
||||||
|
|
||||||
if( ss1_is_sign )
|
if( ss1_is_sign && remainder )
|
||||||
remainder.SetSign();
|
remainder->SetSign();
|
||||||
|
|
||||||
return remainder;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint Div(const Int<value_size> & ss2, Int<value_size> & remainder)
|
||||||
|
{
|
||||||
|
return Div(ss2, &remainder);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -465,7 +539,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
this method convert an sint type to this class
|
this method converts an sint type to this class
|
||||||
*/
|
*/
|
||||||
Int<value_size> & operator=(sint i)
|
Int<value_size> & operator=(sint i)
|
||||||
{
|
{
|
||||||
|
@ -481,7 +555,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
constructor for converting an uint to this class
|
a constructor for converting an uint to this class
|
||||||
*/
|
*/
|
||||||
Int(sint i)
|
Int(sint i)
|
||||||
{
|
{
|
||||||
|
@ -490,7 +564,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
constructor for converting string to this class (with base=10)
|
a constructor for converting string to this class (with base=10)
|
||||||
*/
|
*/
|
||||||
Int(const char * s)
|
Int(const char * s)
|
||||||
{
|
{
|
||||||
|
@ -499,7 +573,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
constructor for converting string to this class (with base=10)
|
a constructor for converting string to this class (with base=10)
|
||||||
*/
|
*/
|
||||||
Int(const std::string & s)
|
Int(const std::string & s)
|
||||||
{
|
{
|
||||||
|
@ -508,7 +582,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
default constructor
|
a default constructor
|
||||||
|
|
||||||
we don't clear table etc.
|
we don't clear table etc.
|
||||||
*/
|
*/
|
||||||
|
@ -518,7 +592,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
the copying constructor
|
a copy constructor
|
||||||
*/
|
*/
|
||||||
template<uint argument_size>
|
template<uint argument_size>
|
||||||
Int(const Int<argument_size> & u) : UInt<value_size>::size(value_size)
|
Int(const Int<argument_size> & u) : UInt<value_size>::size(value_size)
|
||||||
|
@ -537,7 +611,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
this method returns the lowest value from table with the sign
|
this method returns the lowest value from table with a sign
|
||||||
|
|
||||||
we must be sure when we using this method whether the value
|
we must be sure when we using this method whether the value
|
||||||
will hold in an sint type or not (the rest value from table must be zero or -1)
|
will hold in an sint type or not (the rest value from table must be zero or -1)
|
||||||
|
@ -685,10 +759,6 @@ public:
|
||||||
return a1 < a2;
|
return a1 < a2;
|
||||||
|
|
||||||
|
|
||||||
// comparison as int
|
|
||||||
// if( int(UInt<value_size>::table[i]) != int(l.table[i]) )
|
|
||||||
// return int(UInt<value_size>::table[i]) < int(l.table[i]);
|
|
||||||
|
|
||||||
for(--i ; i>=0 ; --i)
|
for(--i ; i>=0 ; --i)
|
||||||
{
|
{
|
||||||
if( UInt<value_size>::table[i] != l.table[i] )
|
if( UInt<value_size>::table[i] != l.table[i] )
|
||||||
|
@ -704,7 +774,6 @@ public:
|
||||||
bool operator>(const Int<value_size> & l) const
|
bool operator>(const Int<value_size> & l) const
|
||||||
{
|
{
|
||||||
sint i=value_size-1;
|
sint i=value_size-1;
|
||||||
|
|
||||||
|
|
||||||
sint a1 = sint(UInt<value_size>::table[i]);
|
sint a1 = sint(UInt<value_size>::table[i]);
|
||||||
sint a2 = sint(l.table[i]);
|
sint a2 = sint(l.table[i]);
|
||||||
|
@ -712,9 +781,6 @@ public:
|
||||||
if( a1 != a2 )
|
if( a1 != a2 )
|
||||||
return a1 > a2;
|
return a1 > a2;
|
||||||
|
|
||||||
// comparison as int
|
|
||||||
// if( int(UInt<value_size>::table[i]) != int(l.table[i]) )
|
|
||||||
// return int(UInt<value_size>::table[i]) > int(l.table[i]);
|
|
||||||
|
|
||||||
for(--i ; i>=0 ; --i)
|
for(--i ; i>=0 ; --i)
|
||||||
{
|
{
|
||||||
|
@ -731,7 +797,6 @@ public:
|
||||||
bool operator<=(const Int<value_size> & l) const
|
bool operator<=(const Int<value_size> & l) const
|
||||||
{
|
{
|
||||||
sint i=value_size-1;
|
sint i=value_size-1;
|
||||||
|
|
||||||
|
|
||||||
sint a1 = sint(UInt<value_size>::table[i]);
|
sint a1 = sint(UInt<value_size>::table[i]);
|
||||||
sint a2 = sint(l.table[i]);
|
sint a2 = sint(l.table[i]);
|
||||||
|
@ -739,9 +804,6 @@ public:
|
||||||
if( a1 != a2 )
|
if( a1 != a2 )
|
||||||
return a1 < a2;
|
return a1 < a2;
|
||||||
|
|
||||||
// comparison as int
|
|
||||||
// if( int(UInt<value_size>::table[i]) != int(l.table[i]) )
|
|
||||||
// return int(UInt<value_size>::table[i]) < int(l.table[i]);
|
|
||||||
|
|
||||||
for(--i ; i>=0 ; --i)
|
for(--i ; i>=0 ; --i)
|
||||||
{
|
{
|
||||||
|
@ -758,7 +820,6 @@ public:
|
||||||
bool operator>=(const Int<value_size> & l) const
|
bool operator>=(const Int<value_size> & l) const
|
||||||
{
|
{
|
||||||
sint i=value_size-1;
|
sint i=value_size-1;
|
||||||
|
|
||||||
|
|
||||||
sint a1 = sint(UInt<value_size>::table[i]);
|
sint a1 = sint(UInt<value_size>::table[i]);
|
||||||
sint a2 = sint(l.table[i]);
|
sint a2 = sint(l.table[i]);
|
||||||
|
@ -766,9 +827,6 @@ public:
|
||||||
if( a1 != a2 )
|
if( a1 != a2 )
|
||||||
return a1 > a2;
|
return a1 > a2;
|
||||||
|
|
||||||
// comparison as int
|
|
||||||
// if( int(UInt<value_size>::table[i]) != int(l.table[i]) )
|
|
||||||
// return int(UInt<value_size>::table[i]) > int(l.table[i]);
|
|
||||||
|
|
||||||
for(--i ; i>=0 ; --i)
|
for(--i ; i>=0 ; --i)
|
||||||
{
|
{
|
||||||
|
@ -880,7 +938,9 @@ public:
|
||||||
Int<value_size> operator%(const Int<value_size> & p2) const
|
Int<value_size> operator%(const Int<value_size> & p2) const
|
||||||
{
|
{
|
||||||
Int<value_size> temp(*this);
|
Int<value_size> temp(*this);
|
||||||
Int<value_size> remainder = temp.Div( p2 );
|
Int<value_size> remainder;
|
||||||
|
|
||||||
|
temp.Div(p2, remainder);
|
||||||
|
|
||||||
return remainder;
|
return remainder;
|
||||||
}
|
}
|
||||||
|
@ -889,7 +949,9 @@ public:
|
||||||
Int<value_size> & operator%=(const Int<value_size> & p2)
|
Int<value_size> & operator%=(const Int<value_size> & p2)
|
||||||
{
|
{
|
||||||
Int<value_size> temp(*this);
|
Int<value_size> temp(*this);
|
||||||
Int<value_size> remainder = temp.Div( p2 );
|
Int<value_size> remainder;
|
||||||
|
|
||||||
|
temp.Div(p2, remainder);
|
||||||
|
|
||||||
operator=(remainder);
|
operator=(remainder);
|
||||||
|
|
||||||
|
@ -898,7 +960,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Prefix operator e.g ++variable
|
Prefix operator e.g. ++variable
|
||||||
*/
|
*/
|
||||||
UInt<value_size> & operator++()
|
UInt<value_size> & operator++()
|
||||||
{
|
{
|
||||||
|
@ -907,8 +969,9 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Postfix operator e.g variable++
|
Postfix operator e.g. variable++
|
||||||
*/
|
*/
|
||||||
UInt<value_size> operator++(int)
|
UInt<value_size> operator++(int)
|
||||||
{
|
{
|
||||||
|
@ -922,7 +985,7 @@ public:
|
||||||
|
|
||||||
UInt<value_size> & operator--()
|
UInt<value_size> & operator--()
|
||||||
{
|
{
|
||||||
AddOne();
|
SubOne();
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,9 +54,11 @@ namespace ttmath
|
||||||
{
|
{
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\brief it implements the big integer value without a sign
|
\brief it implements a big integer value without a sign
|
||||||
|
|
||||||
value_size - how many bytes specify our value (value_size = 1 -> 4 bytes -> 32 bits)
|
value_size - how many bytes specify our value
|
||||||
|
on 32bit platforms: value_size=1 -> 4 bytes -> 32 bits
|
||||||
|
on 64bit platforms: value_size=1 -> 8 bytes -> 64 bits
|
||||||
value_size = 1,2,3,4,5,6....
|
value_size = 1,2,3,4,5,6....
|
||||||
*/
|
*/
|
||||||
template<uint value_size>
|
template<uint value_size>
|
||||||
|
@ -443,7 +445,7 @@ public:
|
||||||
(of course if there was a carry in table[2](5+20) then
|
(of course if there was a carry in table[2](5+20) then
|
||||||
this carry would be passed to the table[3] etc.)
|
this carry would be passed to the table[3] etc.)
|
||||||
*/
|
*/
|
||||||
uint AddTwoInts(uint index, uint x2, uint x1)
|
uint AddTwoInts(uint x2, uint x1, uint index)
|
||||||
{
|
{
|
||||||
register uint b = value_size;
|
register uint b = value_size;
|
||||||
register uint * p1 = table;
|
register uint * p1 = table;
|
||||||
|
@ -1370,7 +1372,7 @@ public:
|
||||||
|
|
||||||
if( x1 <= value_size - 2 )
|
if( x1 <= value_size - 2 )
|
||||||
{
|
{
|
||||||
if( AddTwoInts(x1,r2,r1) )
|
if( AddTwoInts(r2,r1,x1) )
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1549,7 +1551,7 @@ public:
|
||||||
for(uint x2=x2start ; x2<x2size ; ++x2)
|
for(uint x2=x2start ; x2<x2size ; ++x2)
|
||||||
{
|
{
|
||||||
MulTwoWords(table[x1], ss2.table[x2], &r2, &r1);
|
MulTwoWords(table[x1], ss2.table[x2], &r2, &r1);
|
||||||
result.AddTwoInts(x2+x1,r2,r1);
|
result.AddTwoInts(r2,r1,x2+x1);
|
||||||
// here will never be a carry
|
// here will never be a carry
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2578,7 +2580,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
the default constructor
|
a default constructor
|
||||||
|
|
||||||
we don't clear table etc.
|
we don't clear table etc.
|
||||||
*/
|
*/
|
||||||
|
@ -2588,7 +2590,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
the copy constructor
|
a copy constructor
|
||||||
*/
|
*/
|
||||||
UInt(const UInt<value_size> & u)
|
UInt(const UInt<value_size> & u)
|
||||||
{
|
{
|
||||||
|
@ -2608,7 +2610,7 @@ public:
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
the destructor
|
a destructor
|
||||||
*/
|
*/
|
||||||
virtual ~UInt()
|
virtual ~UInt()
|
||||||
{
|
{
|
||||||
|
@ -3010,7 +3012,7 @@ public:
|
||||||
|
|
||||||
UInt<value_size> & operator--()
|
UInt<value_size> & operator--()
|
||||||
{
|
{
|
||||||
AddOne();
|
SubOne();
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
@ -3082,7 +3084,7 @@ public:
|
||||||
|
|
||||||
uint Add(const UInt<value_size> & ss2, uint c=0);
|
uint Add(const UInt<value_size> & ss2, uint c=0);
|
||||||
uint AddInt(uint value, uint index = 0);
|
uint AddInt(uint value, uint index = 0);
|
||||||
uint AddTwoInts(uint index, uint x2, uint x1);
|
uint AddTwoInts(uint x2, uint x1, uint index);
|
||||||
uint Sub(const UInt<value_size> & ss2, uint c=0);
|
uint Sub(const UInt<value_size> & ss2, uint c=0);
|
||||||
uint SubInt(uint value, uint index = 0);
|
uint SubInt(uint value, uint index = 0);
|
||||||
uint Rcl(uint c=0);
|
uint Rcl(uint c=0);
|
||||||
|
|
|
@ -262,7 +262,7 @@ namespace ttmath
|
||||||
this carry would be passed to the table[3] etc.)
|
this carry would be passed to the table[3] etc.)
|
||||||
*/
|
*/
|
||||||
template<uint value_size>
|
template<uint value_size>
|
||||||
uint UInt<value_size>::AddTwoInts(uint index, uint x2, uint x1)
|
uint UInt<value_size>::AddTwoInts(uint x2, uint x1, uint index)
|
||||||
{
|
{
|
||||||
register uint b = value_size;
|
register uint b = value_size;
|
||||||
register uint * p1 = table;
|
register uint * p1 = table;
|
||||||
|
|
Loading…
Reference in New Issue