<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EA%B2%BD%EC%8B%9C%EB%8C%80%ED%9A%8C%EC%A4%80%EB%B9%84%EB%B0%98%2FBigInteger</id>
	<title>경시대회준비반/BigInteger - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=%EA%B2%BD%EC%8B%9C%EB%8C%80%ED%9A%8C%EC%A4%80%EB%B9%84%EB%B0%98%2FBigInteger"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EA%B2%BD%EC%8B%9C%EB%8C%80%ED%9A%8C%EC%A4%80%EB%B9%84%EB%B0%98/BigInteger&amp;action=history"/>
	<updated>2026-05-15T00:41:31Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=%EA%B2%BD%EC%8B%9C%EB%8C%80%ED%9A%8C%EC%A4%80%EB%B9%84%EB%B0%98/BigInteger&amp;diff=85245&amp;oldid=prev</id>
		<title>Maintenance script: Repair batch-0004 pages from live compare</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EA%B2%BD%EC%8B%9C%EB%8C%80%ED%9A%8C%EC%A4%80%EB%B9%84%EB%B0%98/BigInteger&amp;diff=85245&amp;oldid=prev"/>
		<updated>2026-03-27T00:37:14Z</updated>

		<summary type="html">&lt;p&gt;Repair batch-0004 pages from live compare&lt;/p&gt;
&lt;a href=&quot;https://mediawiki.zeropage.org/index.php?title=%EA%B2%BD%EC%8B%9C%EB%8C%80%ED%9A%8C%EC%A4%80%EB%B9%84%EB%B0%98/BigInteger&amp;amp;diff=85245&amp;amp;oldid=41833&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=%EA%B2%BD%EC%8B%9C%EB%8C%80%ED%9A%8C%EC%A4%80%EB%B9%84%EB%B0%98/BigInteger&amp;diff=41833&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:28, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=%EA%B2%BD%EC%8B%9C%EB%8C%80%ED%9A%8C%EC%A4%80%EB%B9%84%EB%B0%98/BigInteger&amp;diff=41833&amp;oldid=prev"/>
		<updated>2021-02-07T05:28:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== About ==&lt;br /&gt;
C++ 용 BigInteger 클래스로 거의 모든 연산을 지원한다. UVA 사이트의 구식(?) 컴파일러에도 문제없이 통과할 뿐 아니라, 성능또한 훌륭하다. 고정도 정수 연산을 하는 문제의 경우, 고정도 연산을 하는 라이브러리를 본인이 직접 짜거나, 이 클래스를 이용하면 된다. 몇 일동안 삽질한 결과 후자가 낫다는 판단이 선다. 되게 잘 짜여진 코드다. 시간 내서 분석해봐야 겠다.&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
 /** &lt;br /&gt;
 * BigInteger Class &lt;br /&gt;
 * Version 6.7.25 &lt;br /&gt;
 * &lt;br /&gt;
 * Copyright (c) 2001 &lt;br /&gt;
 * Mahbub Murshed Suman (suman@bttb.net.bd) &lt;br /&gt;
 * &lt;br /&gt;
 * Permission to use, copy, modify, distribute and sell this software &lt;br /&gt;
 * and its documentation for any purpose is hereby granted without fee, &lt;br /&gt;
 * provided that the above copyright notice appear in all copies and &lt;br /&gt;
 * that both that copyright notice and this permission notice appear &lt;br /&gt;
 * in supporting documentation. Mahbub Murshed Suman makes no &lt;br /&gt;
 * representations about the suitability of this software for any &lt;br /&gt;
 * purpose. It is provided &amp;quot;as is&amp;quot; without express or implied warranty. &lt;br /&gt;
 */ &lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt; &lt;br /&gt;
 #include &amp;amp;lt;cstdlib&amp;amp;gt; &lt;br /&gt;
 #include &amp;amp;lt;cstdio&amp;amp;gt; &lt;br /&gt;
 #include &amp;amp;lt;cctype&amp;amp;gt; &lt;br /&gt;
 #include &amp;amp;lt;malloc.h&amp;amp;gt; &lt;br /&gt;
 #include &amp;amp;lt;cmath&amp;amp;gt; &lt;br /&gt;
 #include &amp;amp;lt;cstring&amp;amp;gt; &lt;br /&gt;
 #include &amp;amp;lt;ctime&amp;amp;gt; &lt;br /&gt;
 #include &amp;amp;lt;strstream&amp;amp;gt; &lt;br /&gt;
 #include &amp;amp;lt;string&amp;amp;gt; &lt;br /&gt;
 #include &amp;amp;lt;stdexcept&amp;amp;gt; &lt;br /&gt;
 &lt;br /&gt;
 using namespace std; &lt;br /&gt;
 &lt;br /&gt;
 namespace BigMath &lt;br /&gt;
 { &lt;br /&gt;
 	enum BigMathERROR { BigMathMEM = 1 , BigMathOVERFLOW , BigMathUNDERFLOW, BigMathINVALIDINTEGER, BigMathDIVIDEBYZERO,BigMathDomain}; &lt;br /&gt;
 	&lt;br /&gt;
 	const char *BigIntErrDes[] = { &amp;quot;Allocation Failed&amp;quot;, &amp;quot;Overflow&amp;quot;,&amp;quot;Underflow&amp;quot;, &amp;quot;Invalid Integer&amp;quot;, &amp;quot;Divide by Zero&amp;quot; ,&amp;quot;Domain Error&amp;quot;}; &lt;br /&gt;
 	const char BigIntPROGRAMNAME[] = { &amp;quot;BigInteger&amp;quot; }; &lt;br /&gt;
 	const int BigIntMajorVersion = 6; &lt;br /&gt;
 	const int BigIntMinorVersion = 7; &lt;br /&gt;
 	const int BigIntRevision = 25; &lt;br /&gt;
 	&lt;br /&gt;
 	void Dump(const char *,enum BigMathERROR); &lt;br /&gt;
 	string&amp;amp;amp; DumpString (char const*,enum BigMathERROR); &lt;br /&gt;
 	&lt;br /&gt;
 	// The Size Type &lt;br /&gt;
 	typedef unsigned int SizeT; &lt;br /&gt;
 	// The Data Type &lt;br /&gt;
 	typedef unsigned int DATATYPE; &lt;br /&gt;
 	&lt;br /&gt;
 	// The Base Used &lt;br /&gt;
 	const DATATYPE BASE = 10000; &lt;br /&gt;
 	// An invalid data &lt;br /&gt;
 	const DATATYPE INVALIDDATA = 65535U; &lt;br /&gt;
 	// Number of digits in `BASE&amp;#039; &lt;br /&gt;
 	const SizeT LOG10BASE = 4; &lt;br /&gt;
 	class BigInteger &lt;br /&gt;
 	{ &lt;br /&gt;
 	private: &lt;br /&gt;
 		// The integer array to hold the number &lt;br /&gt;
 		DATATYPE *TheNumber; &lt;br /&gt;
 		// Start of the location of the number in the array &lt;br /&gt;
 		SizeT Start; &lt;br /&gt;
 		// End of the location of the number in the array &lt;br /&gt;
 		SizeT End; &lt;br /&gt;
 		// True if the number is negative &lt;br /&gt;
 		bool isNegative; &lt;br /&gt;
 		&lt;br /&gt;
 		// Constructor with specified bytes &lt;br /&gt;
 		BigInteger(SizeT,DATATYPE,bool); &lt;br /&gt;
 		&lt;br /&gt;
 		// Copies data to &amp;#039;this&amp;#039; upto size bytes &lt;br /&gt;
 		void datacopy(BigInteger const&amp;amp;amp;,SizeT); &lt;br /&gt;
 		&lt;br /&gt;
 		// Determines valid data range &lt;br /&gt;
 		SizeT datalen(DATATYPE const*) const; &lt;br /&gt;
 		// deallocates the array &lt;br /&gt;
 		void deallocateBigInteger(); &lt;br /&gt;
 		// Trims zeros in front of a number &lt;br /&gt;
 		void TrimZeros(); &lt;br /&gt;
 		// the array with the `fill&amp;#039; value &lt;br /&gt;
 		void Set(DATATYPE); &lt;br /&gt;
 		&lt;br /&gt;
 	public: &lt;br /&gt;
 		// Default Constructor &lt;br /&gt;
 		BigInteger(); &lt;br /&gt;
 		// Long integer constructor &lt;br /&gt;
 		BigInteger(long); &lt;br /&gt;
 		// Character array constructor &lt;br /&gt;
 		BigInteger(char const*); &lt;br /&gt;
 		// Copy Constructor &lt;br /&gt;
 		BigInteger(BigInteger const&amp;amp;amp;); &lt;br /&gt;
 		&lt;br /&gt;
 		// The Destructor &lt;br /&gt;
 		~BigInteger(); &lt;br /&gt;
 		&lt;br /&gt;
 		// Compares Two BigInteger values irrespective of sign &lt;br /&gt;
 		int UnsignedCompareTo(BigInteger const&amp;amp;amp;)const; &lt;br /&gt;
 		// Compares Two BigInteger values &lt;br /&gt;
 		int CompareTo(BigInteger const&amp;amp;amp;)const; &lt;br /&gt;
 		&lt;br /&gt;
 		// Returns Number of digits in the BigInteger &lt;br /&gt;
 		SizeT Digits() const; &lt;br /&gt;
 		// Determines if the number representation is OK or not &lt;br /&gt;
 		bool isValidNumber() const; &lt;br /&gt;
 		// True is the nubmer is zero &lt;br /&gt;
 		bool isZero()const; &lt;br /&gt;
 		&lt;br /&gt;
 		// Straight pen-pencil implementation for addition &lt;br /&gt;
 		BigInteger&amp;amp;amp; Add(BigInteger const&amp;amp;amp;) const; &lt;br /&gt;
 		// Straight pen-pencil implementation for subtraction &lt;br /&gt;
 		BigInteger&amp;amp;amp; Subtract(BigInteger const&amp;amp;amp;) const; &lt;br /&gt;
 		// Straight pen-pencil implementation for multiplication &lt;br /&gt;
 		BigInteger&amp;amp;amp; Multiply(BigInteger const&amp;amp;amp;) const; &lt;br /&gt;
 		BigInteger&amp;amp;amp; Multiply(DATATYPE const&amp;amp;amp;) const; &lt;br /&gt;
 		// Straight pen-pencil implementation for division and remainder &lt;br /&gt;
 		BigInteger&amp;amp;amp; DivideAndRemainder(BigInteger const&amp;amp;amp;,BigInteger&amp;amp;amp;,bool) const; &lt;br /&gt;
 		BigInteger&amp;amp;amp; DivideAndRemainder(DATATYPE const&amp;amp;amp;,DATATYPE&amp;amp;amp;,bool) const; &lt;br /&gt;
 		&lt;br /&gt;
 		// Overloaded Binary Operators &lt;br /&gt;
 		&lt;br /&gt;
 		// Adds Two BigInteger &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; operator+(BigInteger const&amp;amp;amp;, BigInteger const&amp;amp;amp;); &lt;br /&gt;
 		// Subtructs Two BigInteger &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; operator-(BigInteger const&amp;amp;amp;, BigInteger const&amp;amp;amp;); &lt;br /&gt;
 		// Multiplies Two BigInteger &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; operator*(BigInteger const&amp;amp;amp;, BigInteger const&amp;amp;amp;); &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; operator*(BigInteger const&amp;amp;amp;, DATATYPE const&amp;amp;amp;); &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; operator*(DATATYPE const&amp;amp;amp;, BigInteger const&amp;amp;amp;); &lt;br /&gt;
 		// Divides Two BigInteger &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; DivideAndRemainder(BigInteger const&amp;amp;amp;, BigInteger const&amp;amp;amp;,BigInteger&amp;amp;amp;,bool); &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; DivideAndRemainder(BigInteger const&amp;amp;amp;, DATATYPE const&amp;amp;amp;,DATATYPE&amp;amp;amp;,bool); &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; operator/(BigInteger const&amp;amp;amp;, BigInteger const&amp;amp;amp;); &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; operator/(BigInteger const&amp;amp;amp;, DATATYPE const&amp;amp;amp;); &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; operator/(DATATYPE const&amp;amp;amp;, BigInteger const&amp;amp;amp;); &lt;br /&gt;
 		// Modulo Division of Two BigInteger &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; operator%(BigInteger const&amp;amp;amp;, BigInteger const&amp;amp;amp;); &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; operator%(BigInteger const&amp;amp;amp;, DATATYPE const&amp;amp;amp;); &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; operator%(DATATYPE const&amp;amp;amp;, BigInteger const&amp;amp;amp;); &lt;br /&gt;
 		&lt;br /&gt;
 		// Assignment Operator &lt;br /&gt;
 		BigInteger&amp;amp;amp; operator=(BigInteger const&amp;amp;amp;); &lt;br /&gt;
 		&lt;br /&gt;
 		// Inserter &lt;br /&gt;
 		friend ostream&amp;amp;amp; operator&amp;amp;lt;&amp;amp;lt;(ostream&amp;amp;amp; , BigInteger const&amp;amp;amp;); &lt;br /&gt;
 		// Extractor &lt;br /&gt;
 		friend istream&amp;amp;amp; operator&amp;amp;gt;&amp;amp;gt;(istream&amp;amp;amp; , BigInteger&amp;amp;amp; ); &lt;br /&gt;
 		&lt;br /&gt;
 		// Overloaded Unary Operators &lt;br /&gt;
 		&lt;br /&gt;
 		// Postfix Unary Increment &lt;br /&gt;
 		BigInteger&amp;amp;amp; operator++(); &lt;br /&gt;
 		// Prefix Unary Increment &lt;br /&gt;
 		BigInteger&amp;amp;amp; operator++(int); &lt;br /&gt;
 		&lt;br /&gt;
 		// Postfix Unary Decrement &lt;br /&gt;
 		BigInteger&amp;amp;amp; operator--(); &lt;br /&gt;
 		// Prefix Unary Decrement &lt;br /&gt;
 		BigInteger&amp;amp;amp; operator--(int); &lt;br /&gt;
 		&lt;br /&gt;
 		// Negation &lt;br /&gt;
 		BigInteger&amp;amp;amp; operator-(); &lt;br /&gt;
 		&lt;br /&gt;
 		// Bit Wise Operators &lt;br /&gt;
 		&lt;br /&gt;
 		// Left Shift &lt;br /&gt;
 		BigInteger&amp;amp;amp; operator&amp;amp;lt;&amp;amp;lt;(SizeT); &lt;br /&gt;
 		// Right Shift &lt;br /&gt;
 		BigInteger&amp;amp;amp; operator&amp;amp;gt;&amp;amp;gt;(SizeT); &lt;br /&gt;
 		// Returns the BigInteger absolute &lt;br /&gt;
 		void abs(); &lt;br /&gt;
 		friend BigInteger&amp;amp;amp; abs(BigInteger&amp;amp;amp;); &lt;br /&gt;
 		&lt;br /&gt;
 		// Conversion functions &lt;br /&gt;
 		string&amp;amp;amp; toString() const; &lt;br /&gt;
 		int toInt(); &lt;br /&gt;
 		long toLong(); &lt;br /&gt;
 		&lt;br /&gt;
 		// Others &lt;br /&gt;
 		BigInteger&amp;amp;amp; Power(long )const; &lt;br /&gt;
 		BigInteger&amp;amp;amp; SquareRoot() const; &lt;br /&gt;
 }; &lt;br /&gt;
 &lt;br /&gt;
 // Private Constructor which provides a new BigInteger Object &lt;br /&gt;
 // Filled with specified data &lt;br /&gt;
 // Useful for internal operation &lt;br /&gt;
 BigInteger::BigInteger(SizeT bytes,DATATYPE fill, bool toInit = true) &lt;br /&gt;
 { &lt;br /&gt;
 	TheNumber = new DATATYPE[bytes]; &lt;br /&gt;
 	isNegative = false; &lt;br /&gt;
 	Start = 0; &lt;br /&gt;
 	End = bytes - 1; &lt;br /&gt;
 	&lt;br /&gt;
 	if(toInit) Set(fill); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Default Constructor &lt;br /&gt;
 BigInteger::BigInteger() &lt;br /&gt;
 { &lt;br /&gt;
 	TheNumber = new DATATYPE[1]; &lt;br /&gt;
 	TheNumber[0] = 0; &lt;br /&gt;
 	Start = 0; &lt;br /&gt;
 	End = 0; &lt;br /&gt;
 	isNegative = false; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Long Constructor &lt;br /&gt;
 BigInteger::BigInteger(long n) &lt;br /&gt;
 { &lt;br /&gt;
 	if(n&amp;amp;lt;0) &lt;br /&gt;
 	{ &lt;br /&gt;
 		isNegative = true; &lt;br /&gt;
 		n *= -1; &lt;br /&gt;
 	} &lt;br /&gt;
 	else isNegative = false; &lt;br /&gt;
 	&lt;br /&gt;
 	SizeT i = (SizeT)(floor(log10((double)n)/LOG10BASE) + 1); &lt;br /&gt;
 	&lt;br /&gt;
 	Start = 0; &lt;br /&gt;
 	End = i-1; &lt;br /&gt;
 	TheNumber = new DATATYPE [i]; &lt;br /&gt;
 	Set(0); &lt;br /&gt;
 	&lt;br /&gt;
 	while(n) &lt;br /&gt;
 	{ &lt;br /&gt;
 		TheNumber[--i] = n % BASE; &lt;br /&gt;
 		n /= BASE; &lt;br /&gt;
 	} &lt;br /&gt;
 	TrimZeros(); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Character array constructor &lt;br /&gt;
 BigInteger::BigInteger(char const* n) &lt;br /&gt;
 { &lt;br /&gt;
 	if(n[0]==&amp;#039;-&amp;#039;) { isNegative = true; n++; } &lt;br /&gt;
 	else if(n[0]==&amp;#039;+&amp;#039;) { isNegative = false; n++; } &lt;br /&gt;
 	else isNegative = false; &lt;br /&gt;
 	&lt;br /&gt;
 	while(*n==&amp;#039;0&amp;#039;) n++; &lt;br /&gt;
 	&lt;br /&gt;
 	int l = strlen(n); &lt;br /&gt;
 	if(l==0) &lt;br /&gt;
 	{ &lt;br /&gt;
 		*this = *new BigInteger(); &lt;br /&gt;
 		return; &lt;br /&gt;
 	} &lt;br /&gt;
 	Start = 0; &lt;br /&gt;
 	End = (SizeT)(l/LOG10BASE + l%LOG10BASE - 1); &lt;br /&gt;
 	TheNumber = new DATATYPE [Digits()]; &lt;br /&gt;
 	Set(0); &lt;br /&gt;
 	&lt;br /&gt;
 	int cur = l - 1; &lt;br /&gt;
 	for(SizeT i = End; i&amp;amp;gt;=Start;i--) &lt;br /&gt;
 	{ &lt;br /&gt;
 		if(cur&amp;amp;lt;0) break; &lt;br /&gt;
 		DATATYPE r = 0; &lt;br /&gt;
 		DATATYPE TEN = 1; &lt;br /&gt;
 		for(l=0;l&amp;amp;lt;4;l++) &lt;br /&gt;
 		{ &lt;br /&gt;
 			if(cur&amp;amp;lt;0) break; &lt;br /&gt;
 			r = r + TEN*(n[cur]-&amp;#039;0&amp;#039;); &lt;br /&gt;
 			TEN *= 10; &lt;br /&gt;
 			cur--; &lt;br /&gt;
 		} &lt;br /&gt;
 		TheNumber[i] = r; &lt;br /&gt;
 	} &lt;br /&gt;
 	TrimZeros(); &lt;br /&gt;
 	if(isZero()) isNegative = false; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Copy constructor &lt;br /&gt;
 BigInteger::BigInteger(BigInteger const&amp;amp;amp; Temp) &lt;br /&gt;
 { &lt;br /&gt;
 	Start = 0; &lt;br /&gt;
 	End = Temp.Digits() - 1; &lt;br /&gt;
 	TheNumber = new DATATYPE [Temp.Digits()]; &lt;br /&gt;
 	&lt;br /&gt;
 	datacopy(Temp,Temp.Digits()); &lt;br /&gt;
 	isNegative = Temp.isNegative; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Deallocates the array &lt;br /&gt;
 void BigInteger::deallocateBigInteger() &lt;br /&gt;
 { &lt;br /&gt;
 	if(TheNumber!=0) &lt;br /&gt;
 	{ &lt;br /&gt;
 		delete [] TheNumber; &lt;br /&gt;
 		TheNumber = 0; &lt;br /&gt;
 	} &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // The Destructor &lt;br /&gt;
 BigInteger::~BigInteger() &lt;br /&gt;
 { &lt;br /&gt;
 	deallocateBigInteger(); &lt;br /&gt;
 	Start = 0; &lt;br /&gt;
 	End = 0; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Sets the array with the `fill&amp;#039; value &lt;br /&gt;
 void BigInteger::Set(DATATYPE fill) &lt;br /&gt;
 { &lt;br /&gt;
 	for(SizeT i=Start;i&amp;amp;lt;=End;i++) &lt;br /&gt;
 		TheNumber[i] = fill; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Copies data from `a&amp;#039; to `this&amp;#039; &lt;br /&gt;
 void BigInteger::datacopy(BigInteger const&amp;amp;amp; a,SizeT size) &lt;br /&gt;
 { &lt;br /&gt;
 	for(SizeT i=0;i&amp;amp;lt;size;i++) &lt;br /&gt;
 		TheNumber[Start+i] = a.TheNumber[a.Start+i]; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Determines the length upto valid data &lt;br /&gt;
 SizeT BigInteger::datalen(DATATYPE const* a) const &lt;br /&gt;
 { &lt;br /&gt;
 	SizeT l = 0; &lt;br /&gt;
 	while(a[l]!=INVALIDDATA) l++; &lt;br /&gt;
 	return l; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Returns number of digits in a BigInteger &lt;br /&gt;
 SizeT BigInteger::Digits() const &lt;br /&gt;
 { return End-Start+1; } &lt;br /&gt;
 &lt;br /&gt;
 // true if &amp;#039;this&amp;#039; is zero &lt;br /&gt;
 bool BigInteger::isZero() const &lt;br /&gt;
 { return End==Start &amp;amp;amp;&amp;amp;amp; TheNumber[Start]==0; } &lt;br /&gt;
 &lt;br /&gt;
 // Checks for the validity of the number &lt;br /&gt;
 bool BigInteger::isValidNumber() const &lt;br /&gt;
 { &lt;br /&gt;
 	for(SizeT i=Start; i&amp;amp;lt;End ; i++) &lt;br /&gt;
 		if(TheNumber[i]&amp;amp;gt;=BASE) return false; &lt;br /&gt;
 		&lt;br /&gt;
 		return true; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Trims Leading Zeros &lt;br /&gt;
 void BigInteger::TrimZeros() &lt;br /&gt;
 { &lt;br /&gt;
 	while(TheNumber[Start]==0 &amp;amp;amp;&amp;amp;amp; Start&amp;amp;lt;End) &lt;br /&gt;
 		Start++; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Compares this with `with&amp;#039; irrespective of sign &lt;br /&gt;
 // Returns &lt;br /&gt;
 // 0 if equal &lt;br /&gt;
 // 1 if this&amp;amp;gt;with &lt;br /&gt;
 // -1 if this&amp;amp;lt;with &lt;br /&gt;
 int BigInteger::UnsignedCompareTo(BigInteger const&amp;amp;amp; with)const &lt;br /&gt;
 { &lt;br /&gt;
 	if(isZero() &amp;amp;amp;&amp;amp;amp; with.isZero()) return 0; &lt;br /&gt;
 	if(!isZero() &amp;amp;amp;&amp;amp;amp; with.isZero()) return 1; &lt;br /&gt;
 	if(isZero() &amp;amp;amp;&amp;amp;amp; !with.isZero()) return -1; &lt;br /&gt;
 	&lt;br /&gt;
 	long temp = Digits() - with.Digits(); &lt;br /&gt;
 	// Case 3: First One got more digits &lt;br /&gt;
 	// Case 4: First One got less digits &lt;br /&gt;
 	if(temp!=0) return temp&amp;amp;lt;0?-1:1; &lt;br /&gt;
 	&lt;br /&gt;
 	// Now I know Both have same number of digits &lt;br /&gt;
 	// Case 5,6,7: &lt;br /&gt;
 	/* &lt;br /&gt;
 	Compares two array of data considering the &lt;br /&gt;
 	case that both of them have the same number &lt;br /&gt;
 	of digits &lt;br /&gt;
 	*/ &lt;br /&gt;
 	&lt;br /&gt;
 	temp = 0; &lt;br /&gt;
 	int cmp = 0; &lt;br /&gt;
 	for(SizeT i=0;i&amp;amp;lt;Digits();i++) &lt;br /&gt;
 	{ &lt;br /&gt;
 		temp = TheNumber[i+Start] - with.TheNumber[i+with.Start]; &lt;br /&gt;
 		if(temp!=0) &lt;br /&gt;
 		{ &lt;br /&gt;
 			cmp = temp&amp;amp;lt;0?-1:1; &lt;br /&gt;
 			break; &lt;br /&gt;
 		} &lt;br /&gt;
 	} &lt;br /&gt;
 	&lt;br /&gt;
 	return cmp; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Compares this with `with&amp;#039; &lt;br /&gt;
 // Returns &lt;br /&gt;
 // 0 if equal &lt;br /&gt;
 // 1 if this&amp;amp;gt;with &lt;br /&gt;
 // -1 if this&amp;amp;lt;with &lt;br /&gt;
 int BigInteger::CompareTo(BigInteger const&amp;amp;amp; with)const &lt;br /&gt;
 { &lt;br /&gt;
 	int cmp = UnsignedCompareTo(with); &lt;br /&gt;
 	&lt;br /&gt;
 	// Case 1: Positive , Negative &lt;br /&gt;
 	if(isNegative==false &amp;amp;amp;&amp;amp;amp; with.isNegative==true) return 1; &lt;br /&gt;
 	// Case 2: Negative, Positive &lt;br /&gt;
 	if(isNegative==true &amp;amp;amp;&amp;amp;amp; with.isNegative==false) return -1; &lt;br /&gt;
 	// Now, Both are Same Sign &lt;br /&gt;
 	int both_neg = 1; &lt;br /&gt;
 	if(isNegative==true &amp;amp;amp;&amp;amp;amp; with.isNegative==true) both_neg = -1; &lt;br /&gt;
 	return cmp*both_neg; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Implentation of addition by paper-pencil method &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::Add(BigInteger const&amp;amp;amp; Small) const &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger const&amp;amp;amp; Big = *this; &lt;br /&gt;
 	BigInteger &amp;amp;amp;Result= *new BigInteger(Big.Digits()+1,0); &lt;br /&gt;
 	&lt;br /&gt;
 	long Carry=0,Plus; &lt;br /&gt;
 	long i=Big.Digits() - 1, &lt;br /&gt;
 		j=Small.Digits() -1; &lt;br /&gt;
 	&lt;br /&gt;
 	for(; i&amp;amp;gt;=0 ;i--,j--){ &lt;br /&gt;
 		Plus = Big.TheNumber[i+Big.Start] + Carry; &lt;br /&gt;
 		if(j&amp;amp;gt;=0) Plus += Small.TheNumber[j+Small.Start] ; &lt;br /&gt;
 		&lt;br /&gt;
 		Result.TheNumber[i+1] = Plus%BASE; &lt;br /&gt;
 		Carry = Plus/BASE; &lt;br /&gt;
 	} &lt;br /&gt;
 	i++; &lt;br /&gt;
 	&lt;br /&gt;
 	if(Carry) Result.TheNumber[i--] = Carry; &lt;br /&gt;
 	&lt;br /&gt;
 	Result.TrimZeros(); &lt;br /&gt;
 	&lt;br /&gt;
 	return Result; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Implentation of subtraction by paper-pencil method &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::Subtract(BigInteger const&amp;amp;amp; Small)const &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger const&amp;amp;amp; Big = *this; &lt;br /&gt;
 	BigInteger&amp;amp;amp; Result = *new BigInteger(Big.Digits()+1,0); &lt;br /&gt;
 	&lt;br /&gt;
 	long Carry=0,Minus; &lt;br /&gt;
 	&lt;br /&gt;
 	long i = Big.Digits() - 1, &lt;br /&gt;
 		j= Small.Digits() - 1; &lt;br /&gt;
 	&lt;br /&gt;
 	for( ; i&amp;amp;gt;=0 ;i--,j--) &lt;br /&gt;
 	{ &lt;br /&gt;
 		Minus = Big.TheNumber[i+Big.Start] - Carry; &lt;br /&gt;
 		if(j&amp;amp;gt;=0) Minus -= Small.TheNumber[j+Small.Start]; &lt;br /&gt;
 		&lt;br /&gt;
 		if(Minus &amp;amp;lt; 0) &lt;br /&gt;
 		{ &lt;br /&gt;
 			Result.TheNumber[i+1] = Minus + BASE; &lt;br /&gt;
 			Carry = 1; &lt;br /&gt;
 		} &lt;br /&gt;
 		else &lt;br /&gt;
 		{ &lt;br /&gt;
 			Result.TheNumber[i+1] = Minus; &lt;br /&gt;
 			Carry = 0; &lt;br /&gt;
 		} &lt;br /&gt;
 	} &lt;br /&gt;
 	Result.TrimZeros(); &lt;br /&gt;
 	return Result; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Addition operator &lt;br /&gt;
 BigInteger&amp;amp;amp; operator+(BigInteger const&amp;amp;amp; N1, BigInteger const&amp;amp;amp; N2) &lt;br /&gt;
 { &lt;br /&gt;
 	if(N1.isNegative &amp;amp;amp;&amp;amp;amp; !N2.isNegative) &lt;br /&gt;
 	{ &lt;br /&gt;
 		// First is negaive and second is not &lt;br /&gt;
 		BigInteger&amp;amp;amp; Res = *new BigInteger(N1); &lt;br /&gt;
 		Res.isNegative = false; &lt;br /&gt;
 		Res = N2-Res; &lt;br /&gt;
 		return Res; &lt;br /&gt;
 	} &lt;br /&gt;
 	if(!N1.isNegative &amp;amp;amp;&amp;amp;amp; N2.isNegative) &lt;br /&gt;
 	{ &lt;br /&gt;
 		// Second is negaive and first is not &lt;br /&gt;
 		BigInteger&amp;amp;amp; Res = *new BigInteger(N2); &lt;br /&gt;
 		Res.isNegative = false; &lt;br /&gt;
 		Res = N1-Res; &lt;br /&gt;
 		return Res; &lt;br /&gt;
 	} &lt;br /&gt;
 	&lt;br /&gt;
 	BigInteger&amp;amp;amp; ret = *new BigInteger(); &lt;br /&gt;
 	&lt;br /&gt;
 	if(N1.UnsignedCompareTo(N2)&amp;amp;lt;0) &lt;br /&gt;
 		ret = N2.Add(N1); &lt;br /&gt;
 	else &lt;br /&gt;
 		ret = N1.Add(N2); &lt;br /&gt;
 	if(N1.isNegative==true &amp;amp;amp;&amp;amp;amp; N2.isNegative==true) &lt;br /&gt;
 		ret.isNegative = true; &lt;br /&gt;
 	return ret; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Subtruction operator &lt;br /&gt;
 BigInteger&amp;amp;amp; operator-(BigInteger const&amp;amp;amp; N1, BigInteger const&amp;amp;amp; N2) &lt;br /&gt;
 { &lt;br /&gt;
 	if(N1.isNegative &amp;amp;amp;&amp;amp;amp; !N2.isNegative) &lt;br /&gt;
 	{ &lt;br /&gt;
 		BigInteger&amp;amp;amp; res = *new BigInteger(N1); &lt;br /&gt;
 		res.isNegative = false; &lt;br /&gt;
 		res = res+N2; &lt;br /&gt;
 		res.isNegative = true; &lt;br /&gt;
 		return res; &lt;br /&gt;
 	} &lt;br /&gt;
 	if(!N1.isNegative &amp;amp;amp;&amp;amp;amp; N2.isNegative) &lt;br /&gt;
 	{ &lt;br /&gt;
 		BigInteger&amp;amp;amp; res = *new BigInteger(N2); &lt;br /&gt;
 		res.isNegative = false; &lt;br /&gt;
 		res = res+N1; &lt;br /&gt;
 		return res; &lt;br /&gt;
 	} &lt;br /&gt;
 	&lt;br /&gt;
 	&lt;br /&gt;
 	BigInteger&amp;amp;amp; ret = *new BigInteger(); &lt;br /&gt;
 	int cmp = N1.UnsignedCompareTo(N2); &lt;br /&gt;
 	if(cmp==0) &lt;br /&gt;
 	{ &lt;br /&gt;
 		ret = *new BigInteger(); &lt;br /&gt;
 	} &lt;br /&gt;
 	if(cmp&amp;amp;lt;0) &lt;br /&gt;
 	{ &lt;br /&gt;
 		ret = N2.Subtract(N1); &lt;br /&gt;
 		ret.isNegative = true; &lt;br /&gt;
 	} &lt;br /&gt;
 	else &lt;br /&gt;
 	{ &lt;br /&gt;
 		ret = N1.Subtract(N2); &lt;br /&gt;
 		ret.isNegative = false; &lt;br /&gt;
 	} &lt;br /&gt;
 	return ret; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Implentation of multiplication by paper-pencil method &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::Multiply(BigInteger const&amp;amp;amp; Small) const &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger const&amp;amp;amp; Big = *this; &lt;br /&gt;
 	BigInteger&amp;amp;amp; Result = *new BigInteger(Big.Digits()+Small.Digits(),0); &lt;br /&gt;
 	&lt;br /&gt;
 	long Carry,Multiply; &lt;br /&gt;
 	&lt;br /&gt;
 	SizeT i; &lt;br /&gt;
 	SizeT j; &lt;br /&gt;
 	&lt;br /&gt;
 	for(i = 0 ; i&amp;amp;lt; Small.Digits() ; i++) &lt;br /&gt;
 	{ &lt;br /&gt;
 		Carry = 0; &lt;br /&gt;
 		for(j = 0 ; j&amp;amp;lt; Big.Digits() ; j++) &lt;br /&gt;
 		{ &lt;br /&gt;
 			Multiply = ( (long)Small.TheNumber[Small.End-i] * (long)Big.TheNumber[Big.End-j] ) &lt;br /&gt;
 				+ Carry + Result.TheNumber[Result.End-i-j]; &lt;br /&gt;
 			Result.TheNumber[Result.End-i-j] = Multiply%BASE; &lt;br /&gt;
 			Carry = Multiply/BASE ; &lt;br /&gt;
 		} &lt;br /&gt;
 		Result.TheNumber[Result.End-i-j] = Carry; &lt;br /&gt;
 	} &lt;br /&gt;
 	&lt;br /&gt;
 	Result.TrimZeros(); &lt;br /&gt;
 	&lt;br /&gt;
 	return Result; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Implentation of multiplication by paper-pencil method &lt;br /&gt;
 // See: D. E. Knuth 4.3.1 &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::Multiply(DATATYPE const&amp;amp;amp; with) const &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger&amp;amp;amp; Result = *new BigInteger(Digits()+1,0); &lt;br /&gt;
 	&lt;br /&gt;
 	long Carry,Multiply; &lt;br /&gt;
 	&lt;br /&gt;
 	SizeT i; &lt;br /&gt;
 	&lt;br /&gt;
 	Carry = 0; &lt;br /&gt;
 	for(i = 0 ; i&amp;amp;lt; Digits() ; i++) &lt;br /&gt;
 	{ &lt;br /&gt;
 		Multiply = Carry + (long)TheNumber[End-i] * (long)with; &lt;br /&gt;
 		Carry = Multiply / BASE; &lt;br /&gt;
 		Result.TheNumber[Result.End-i] = Multiply % BASE; &lt;br /&gt;
 	} &lt;br /&gt;
 	Result.TheNumber[Result.End-i] = Carry; &lt;br /&gt;
 	Result.TrimZeros(); &lt;br /&gt;
 	&lt;br /&gt;
 	return Result; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Multiplication operator &lt;br /&gt;
 BigInteger&amp;amp;amp; operator*(BigInteger const&amp;amp;amp; N1, BigInteger const&amp;amp;amp; N2) &lt;br /&gt;
 { &lt;br /&gt;
 	if(N1.isZero() || N2.isZero()) return *new BigInteger(); &lt;br /&gt;
 	BigInteger&amp;amp;amp; ret = *new BigInteger(); &lt;br /&gt;
 	if(N1.UnsignedCompareTo(N2)&amp;amp;lt;0) &lt;br /&gt;
 		ret = N2.Multiply(N1); &lt;br /&gt;
 	else &lt;br /&gt;
 		ret = N1.Multiply(N2); &lt;br /&gt;
 	if(N1.isNegative!=N2.isNegative) &lt;br /&gt;
 		ret. isNegative = true; &lt;br /&gt;
 	return ret; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Multiplication operator &lt;br /&gt;
 BigInteger&amp;amp;amp; operator*(BigInteger const&amp;amp;amp; N1, DATATYPE const&amp;amp;amp; N2) &lt;br /&gt;
 { &lt;br /&gt;
 	if(N1.isZero() || N2==0) return *new BigInteger(); &lt;br /&gt;
 	BigInteger&amp;amp;amp; ret = N1.Multiply(N2); &lt;br /&gt;
 	// if(N1.isNegative!=(N2&amp;amp;lt;0)) ret. isNegative = true; &lt;br /&gt;
 	return ret; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Multiplication operator &lt;br /&gt;
 BigInteger&amp;amp;amp; operator*(DATATYPE const&amp;amp;amp; N1, BigInteger const&amp;amp;amp; N2) &lt;br /&gt;
 { &lt;br /&gt;
 	if(N2.isZero() || N1==0) return *new BigInteger(); &lt;br /&gt;
 	BigInteger&amp;amp;amp; ret = N2.Multiply(N1); &lt;br /&gt;
 	// if(N2.isNegative!=(N1&amp;amp;lt;0)) ret. isNegative = true; &lt;br /&gt;
 	return ret; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Implentation of division by paper-pencil method &lt;br /&gt;
 // Here `this&amp;#039; is divided by &amp;#039;V&amp;#039; &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::DivideAndRemainder(DATATYPE const&amp;amp;amp; V,DATATYPE&amp;amp;amp; _R,bool skipRemainder=false) const &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger&amp;amp;amp; W = *new BigInteger(Digits(),0,false); &lt;br /&gt;
 	DATATYPE R = 0; &lt;br /&gt;
 	SizeT j; &lt;br /&gt;
 	for(j=0;j&amp;amp;lt;=End;j++) &lt;br /&gt;
 	{ &lt;br /&gt;
 		W.TheNumber[j] = (R*BASE+TheNumber[Start+j])/V; &lt;br /&gt;
 		R = (R*BASE+TheNumber[Start+j])%V; &lt;br /&gt;
 	} &lt;br /&gt;
 	&lt;br /&gt;
 	W.TrimZeros(); &lt;br /&gt;
 	if(skipRemainder==false) &lt;br /&gt;
 		_R = R; &lt;br /&gt;
 	&lt;br /&gt;
 	return W; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Implentation of division by paper-pencil method &lt;br /&gt;
 // Does not perform the validity and sign check &lt;br /&gt;
 // It is assumed that this &amp;amp;gt; `_V&amp;#039; &lt;br /&gt;
 // See: D.E.Knuth 4.3.1 &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::DivideAndRemainder(BigInteger const&amp;amp;amp; _V,BigInteger&amp;amp;amp; R,bool skipRemainder=false) const &lt;br /&gt;
 { &lt;br /&gt;
 	SizeT m = this-&amp;amp;gt;Digits()-_V.Digits(); &lt;br /&gt;
 	SizeT n = _V.Digits(); &lt;br /&gt;
 	BigInteger&amp;amp;amp; Q = *new BigInteger(m+1,0,false); &lt;br /&gt;
 	&lt;br /&gt;
 	DATATYPE d, qhat, rhat; &lt;br /&gt;
 	long temp,x,y; &lt;br /&gt;
 	SizeT i; &lt;br /&gt;
 	int j; &lt;br /&gt;
 	&lt;br /&gt;
 	d = (BASE-1)/_V.TheNumber[_V.Start]; &lt;br /&gt;
 	&lt;br /&gt;
 	BigInteger&amp;amp;amp; U = this-&amp;amp;gt;Multiply(d); &lt;br /&gt;
 	BigInteger&amp;amp;amp; V = _V.Multiply(d); &lt;br /&gt;
 	&lt;br /&gt;
 	for(j = m; j&amp;amp;gt;=0; j--) &lt;br /&gt;
 	{ &lt;br /&gt;
 		temp = (long)U.TheNumber[U.End-j-n]*(long)BASE + (long)U.TheNumber[U.End-j-n+1]; &lt;br /&gt;
 		x = temp / (long)V.TheNumber[V.Start]; &lt;br /&gt;
 		y = temp % (long)V.TheNumber[V.Start]; &lt;br /&gt;
 		if(x&amp;amp;gt;(long)BASE) x /= BASE; &lt;br /&gt;
 		if(y&amp;amp;gt;(long)BASE) y %= BASE; &lt;br /&gt;
 		qhat = (DATATYPE) x; &lt;br /&gt;
 		rhat = (DATATYPE) y; &lt;br /&gt;
 		&lt;br /&gt;
 		bool badRhat = false; &lt;br /&gt;
 		do &lt;br /&gt;
 		{ &lt;br /&gt;
 			x = (long)qhat * (long)V.TheNumber[V.Start+1]; &lt;br /&gt;
 			y = (long)BASE*(long)rhat + (long)U.TheNumber[U.End-j-n+1]; &lt;br /&gt;
 			&lt;br /&gt;
 			if(qhat==BASE || x &amp;amp;gt; y) &lt;br /&gt;
 			{ &lt;br /&gt;
 				qhat --; &lt;br /&gt;
 				rhat += V.TheNumber[V.Start]; &lt;br /&gt;
 				if(rhat&amp;amp;lt;BASE) badRhat = true; &lt;br /&gt;
 				else badRhat = false; &lt;br /&gt;
 			} &lt;br /&gt;
 			else break; &lt;br /&gt;
 		}while(badRhat); &lt;br /&gt;
 		&lt;br /&gt;
 		// `x&amp;#039; Will act as Carry in the next loop &lt;br /&gt;
 		x = 0; &lt;br /&gt;
 		temp = 0; &lt;br /&gt;
 		for(i=0;i&amp;amp;lt;=n;i++) &lt;br /&gt;
 		{ &lt;br /&gt;
 			if(V.End&amp;amp;gt;=i) temp = (long)qhat*(long)V.TheNumber[V.End-i] + temp; &lt;br /&gt;
 			y = (long)U.TheNumber[U.End-j-i] - temp%BASE - x; &lt;br /&gt;
 			temp /= BASE; &lt;br /&gt;
 			if(y &amp;amp;lt; 0) &lt;br /&gt;
 			{ &lt;br /&gt;
 				U.TheNumber[U.End-j-i] = (DATATYPE)(y+BASE); &lt;br /&gt;
 				x = 1; &lt;br /&gt;
 			} &lt;br /&gt;
 			else &lt;br /&gt;
 			{ &lt;br /&gt;
 				U.TheNumber[U.End-j-i] = (DATATYPE)y; &lt;br /&gt;
 				x = 0; &lt;br /&gt;
 			} &lt;br /&gt;
 		} &lt;br /&gt;
 		// if(x) U.TheNumber[U.Start+j+i] --; &lt;br /&gt;
 		&lt;br /&gt;
 		Q.TheNumber[Q.End-j] = qhat; &lt;br /&gt;
 		&lt;br /&gt;
 		if(x) &lt;br /&gt;
 		{ &lt;br /&gt;
 			Q.TheNumber[Q.End-j] --; &lt;br /&gt;
 			// `x&amp;#039; Will act as Carry in the next loop &lt;br /&gt;
 			x = 0; &lt;br /&gt;
 			for(i=0;i&amp;amp;lt;=n;i++) &lt;br /&gt;
 			{ &lt;br /&gt;
 				y = (long)U.TheNumber[U.End-j-i] + x; &lt;br /&gt;
 				if(V.End&amp;amp;gt;=i) y += (long)V.TheNumber[V.End-i]; &lt;br /&gt;
 				U.TheNumber[U.End-j-i] = (DATATYPE)(y % BASE); &lt;br /&gt;
 				x = y / BASE; &lt;br /&gt;
 			} &lt;br /&gt;
 			U.TheNumber[U.End-j-i] = (DATATYPE)x; &lt;br /&gt;
 		} &lt;br /&gt;
 	} &lt;br /&gt;
 	&lt;br /&gt;
 	U.TrimZeros(); &lt;br /&gt;
 	DATATYPE _t; &lt;br /&gt;
 	if(skipRemainder==false) &lt;br /&gt;
 		R = U.DivideAndRemainder(d,_t,true); &lt;br /&gt;
 	Q.TrimZeros(); &lt;br /&gt;
 	&lt;br /&gt;
 	return Q; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Front end for Divide and Remainder &lt;br /&gt;
 // Performs the validity and sign check &lt;br /&gt;
 BigInteger&amp;amp;amp; DivideAndRemainder(BigInteger const&amp;amp;amp; U, BigInteger const&amp;amp;amp; V,BigInteger&amp;amp;amp; R,bool skipRemainder=false) &lt;br /&gt;
 { &lt;br /&gt;
 	if(V.isZero()) &lt;br /&gt;
 		throw logic_error (DumpString (&amp;quot;DivideAndRemainder (BigInteger/BigInteger)&amp;quot;,BigMathDIVIDEBYZERO)); &lt;br /&gt;
 	&lt;br /&gt;
 	if(U.isZero()) &lt;br /&gt;
 	{ &lt;br /&gt;
 		R = *new BigInteger(); &lt;br /&gt;
 		return *new BigInteger(); &lt;br /&gt;
 	} &lt;br /&gt;
 	&lt;br /&gt;
 	int cmp = U.UnsignedCompareTo(V); &lt;br /&gt;
 	if(cmp==0) &lt;br /&gt;
 	{ &lt;br /&gt;
 		R = *new BigInteger(); &lt;br /&gt;
 		BigInteger&amp;amp;amp; W = *new BigInteger(1l); &lt;br /&gt;
 		if(U.isNegative!=V.isNegative) W.isNegative = true; &lt;br /&gt;
 		return W; &lt;br /&gt;
 	} &lt;br /&gt;
 	else if(cmp&amp;amp;lt;0) &lt;br /&gt;
 	{ &lt;br /&gt;
 		R = *new BigInteger(U); &lt;br /&gt;
 		if(U.isNegative!=V.isNegative) R.isNegative = true; &lt;br /&gt;
 		return *new BigInteger(); &lt;br /&gt;
 	} &lt;br /&gt;
 	BigInteger&amp;amp;amp; ret = U.DivideAndRemainder(V,R,skipRemainder); &lt;br /&gt;
 	if(U.isNegative!=V.isNegative) ret.isNegative = true; &lt;br /&gt;
 	return ret; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Front end for Divide and Remainder &lt;br /&gt;
 // Performs the validity and sign check &lt;br /&gt;
 BigInteger&amp;amp;amp; DivideAndRemainder(BigInteger const&amp;amp;amp; U, DATATYPE const&amp;amp;amp; V,DATATYPE&amp;amp;amp; R,bool skipRemainder=false) &lt;br /&gt;
 { &lt;br /&gt;
 	if(V==0) &lt;br /&gt;
 		throw logic_error ( DumpString (&amp;quot;DivideAndRemainder (BigInteger/DATATYPE)&amp;quot;,BigMathDIVIDEBYZERO) ); &lt;br /&gt;
 	&lt;br /&gt;
 	if(U.isZero()) &lt;br /&gt;
 	{ &lt;br /&gt;
 		R = 0; &lt;br /&gt;
 		return *new BigInteger(); &lt;br /&gt;
 	} &lt;br /&gt;
 	&lt;br /&gt;
 	int cmp = 1; &lt;br /&gt;
 	if(U.Digits()==1) &lt;br /&gt;
 	{ &lt;br /&gt;
 		if(U.TheNumber[U.Start]&amp;amp;lt;V) cmp = -1; &lt;br /&gt;
 		else if(U.TheNumber[U.Start]&amp;amp;gt;V) cmp = 1; &lt;br /&gt;
 		else cmp = 0; &lt;br /&gt;
 	} &lt;br /&gt;
 	if(cmp==0) &lt;br /&gt;
 	{ &lt;br /&gt;
 		R = 0; &lt;br /&gt;
 		return *new BigInteger(1l); &lt;br /&gt;
 	} &lt;br /&gt;
 	else if(cmp&amp;amp;lt;0) &lt;br /&gt;
 	{ &lt;br /&gt;
 		R = U.TheNumber[U.Start]; &lt;br /&gt;
 		return *new BigInteger(); &lt;br /&gt;
 	} &lt;br /&gt;
 	BigInteger&amp;amp;amp; ret = U.DivideAndRemainder(V,R,skipRemainder); &lt;br /&gt;
 	// if(U.isNegative!=(V&amp;amp;lt;0)) ret.isNegative = true; &lt;br /&gt;
 	return ret; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Division operator &lt;br /&gt;
 BigInteger&amp;amp;amp; operator/(BigInteger const&amp;amp;amp; N1, BigInteger const&amp;amp;amp; N2) &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger&amp;amp;amp; R = *new BigInteger(); &lt;br /&gt;
 	return DivideAndRemainder(N1,N2,R,true); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Division operator &lt;br /&gt;
 BigInteger&amp;amp;amp; operator/(BigInteger const&amp;amp;amp; U, DATATYPE const&amp;amp;amp; V) &lt;br /&gt;
 { &lt;br /&gt;
 	DATATYPE R; &lt;br /&gt;
 	return DivideAndRemainder(U,V,R,true); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Division operator &lt;br /&gt;
 BigInteger&amp;amp;amp; operator/(DATATYPE const&amp;amp;amp; U, BigInteger const&amp;amp;amp; V) &lt;br /&gt;
 { &lt;br /&gt;
 	if(V.Digits()==1 &amp;amp;amp;&amp;amp;amp; U&amp;amp;gt;V.TheNumber[V.Start]) &lt;br /&gt;
 	{ &lt;br /&gt;
 		return *new BigInteger(U/V.TheNumber[V.Start]); &lt;br /&gt;
 	} &lt;br /&gt;
 	return *new BigInteger(); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Modulus operator &lt;br /&gt;
 BigInteger&amp;amp;amp; operator%(BigInteger const&amp;amp;amp; N1,BigInteger const&amp;amp;amp; N2) &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger&amp;amp;amp; R = *new BigInteger(); &lt;br /&gt;
 	DivideAndRemainder(N1,N2,R); &lt;br /&gt;
 	return R; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Modulus operator &lt;br /&gt;
 BigInteger&amp;amp;amp; operator%(BigInteger const&amp;amp;amp; U, DATATYPE const&amp;amp;amp; V) &lt;br /&gt;
 { &lt;br /&gt;
 	DATATYPE R; &lt;br /&gt;
 	DivideAndRemainder(U,V,R); &lt;br /&gt;
 	return *new BigInteger(R); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Modulus operator &lt;br /&gt;
 BigInteger&amp;amp;amp; operator%(DATATYPE const&amp;amp;amp; U, BigInteger const&amp;amp;amp; V) &lt;br /&gt;
 { &lt;br /&gt;
 	if(V.Digits()==1 &amp;amp;amp;&amp;amp;amp; U&amp;amp;gt;V.TheNumber[V.Start]) &lt;br /&gt;
 	{ &lt;br /&gt;
 		return *new BigInteger(U%V.TheNumber[V.Start]); &lt;br /&gt;
 	} &lt;br /&gt;
 	return *new BigInteger(); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Assignment Operator &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::operator=(BigInteger const&amp;amp;amp;arg) &lt;br /&gt;
 { &lt;br /&gt;
 	Start = 0; &lt;br /&gt;
 	End = arg.Digits() - 1; &lt;br /&gt;
 	delete [] TheNumber; &lt;br /&gt;
 	TheNumber = new DATATYPE [arg.Digits()]; &lt;br /&gt;
 	&lt;br /&gt;
 	datacopy(arg,arg.Digits()); &lt;br /&gt;
 	isNegative = arg.isNegative; &lt;br /&gt;
 	return *this; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Inserter &lt;br /&gt;
 ostream&amp;amp;amp; operator&amp;amp;lt;&amp;amp;lt;(ostream&amp;amp;amp; stream, BigInteger const&amp;amp;amp; out) &lt;br /&gt;
 { &lt;br /&gt;
 	if(out.isNegative==true &amp;amp;amp;&amp;amp;amp; out.isZero()==false) stream &amp;amp;lt;&amp;amp;lt; &amp;#039;-&amp;#039;; &lt;br /&gt;
 	stream &amp;amp;lt;&amp;amp;lt; out.TheNumber[out.Start]; &lt;br /&gt;
 	for(SizeT i=out.Start+1;i&amp;amp;lt;=out.End;i++) &lt;br /&gt;
 	{ &lt;br /&gt;
 		stream.width(4); &lt;br /&gt;
 		stream.fill(&amp;#039;0&amp;#039;); &lt;br /&gt;
 		stream &amp;amp;lt;&amp;amp;lt; out.TheNumber[i]; &lt;br /&gt;
 	} &lt;br /&gt;
 	&lt;br /&gt;
 	return stream; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Extracter &lt;br /&gt;
 istream&amp;amp;amp; operator&amp;amp;gt;&amp;amp;gt;(istream&amp;amp;amp; stream, BigInteger&amp;amp;amp; in) &lt;br /&gt;
 { &lt;br /&gt;
 	SizeT SIZE = 500; &lt;br /&gt;
 	char *data = new char[SIZE]; &lt;br /&gt;
 	// if(data==0) Dump(&amp;quot;Extractor operator&amp;quot;,BigMathMEM); &lt;br /&gt;
 	SizeT i = 0; &lt;br /&gt;
 	int input; &lt;br /&gt;
 	bool isNegative = false; &lt;br /&gt;
 	stream &amp;amp;gt;&amp;amp;gt; ws; &lt;br /&gt;
 	input = stream.get(); &lt;br /&gt;
 	if(input==&amp;#039;-&amp;#039;) isNegative = true; &lt;br /&gt;
 	else if(input==&amp;#039;+&amp;#039;) isNegative = false; &lt;br /&gt;
 	else stream.putback(input); &lt;br /&gt;
 	&lt;br /&gt;
 	while(true) &lt;br /&gt;
 	{ &lt;br /&gt;
 		input = stream.get(); &lt;br /&gt;
 		if(isdigit(input)) &lt;br /&gt;
 			data[i++] = input; &lt;br /&gt;
 		else &lt;br /&gt;
 		{ &lt;br /&gt;
 			stream.putback(input); &lt;br /&gt;
 			break; &lt;br /&gt;
 		} &lt;br /&gt;
 		if(i&amp;amp;gt;=SIZE) &lt;br /&gt;
 		{ &lt;br /&gt;
 			SIZE += SIZE; &lt;br /&gt;
 			char *p = new char [SIZE]; &lt;br /&gt;
 			// if(p==0) Dump(&amp;quot;Extractor operator&amp;quot;,BigMathMEM); &lt;br /&gt;
 			strcpy(p,data); &lt;br /&gt;
 			delete [] data; &lt;br /&gt;
 			data = p; &lt;br /&gt;
 		} &lt;br /&gt;
 	} &lt;br /&gt;
 	data[i] = 0; &lt;br /&gt;
 	in = *new BigInteger(data); &lt;br /&gt;
 	if(in.isZero()==false) &lt;br /&gt;
 		in.isNegative = isNegative; &lt;br /&gt;
 	return stream; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Inserts the version information into the output stream &lt;br /&gt;
 ostream&amp;amp;amp; BigIntegerVersion(ostream&amp;amp;amp; out) &lt;br /&gt;
 { &lt;br /&gt;
 	out &amp;amp;lt;&amp;amp;lt; BigIntPROGRAMNAME &amp;amp;lt;&amp;amp;lt; &amp;quot; (Version &amp;quot;&amp;amp;lt;&amp;amp;lt; BigIntMajorVersion &lt;br /&gt;
 		&amp;amp;lt;&amp;amp;lt; &amp;quot;.&amp;quot; &amp;amp;lt;&amp;amp;lt; BigIntMinorVersion &amp;amp;lt;&amp;amp;lt; &amp;quot;.&amp;quot; &amp;amp;lt;&amp;amp;lt; BigIntRevision &amp;amp;lt;&amp;amp;lt; &amp;quot;)&amp;quot;; &lt;br /&gt;
 	return out; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Inserts the author information into the output stream &lt;br /&gt;
 ostream&amp;amp;amp; BigIntegerAuthor(ostream&amp;amp;amp; out) &lt;br /&gt;
 { &lt;br /&gt;
 	out &amp;amp;lt;&amp;amp;lt; &amp;quot;Author: S. M. Mahbub Murshed&amp;quot; &amp;amp;lt;&amp;amp;lt; &lt;br /&gt;
 		endl &amp;amp;lt;&amp;amp;lt; &amp;quot;mailto: suman@bttb.net.bd&amp;quot;; &lt;br /&gt;
 	return out; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Inserts the about information into the output stream &lt;br /&gt;
 ostream&amp;amp;amp; BigIntegerAbout(ostream&amp;amp;amp; out) &lt;br /&gt;
 { &lt;br /&gt;
 	out &amp;amp;lt;&amp;amp;lt; BigIntegerVersion &amp;amp;lt;&amp;amp;lt; endl &amp;amp;lt;&amp;amp;lt; BigIntegerAuthor &amp;amp;lt;&amp;amp;lt; endl; &lt;br /&gt;
 	return out; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Returns a string containing version information &lt;br /&gt;
 string&amp;amp;amp; BigIntegerVersionString() &lt;br /&gt;
 { &lt;br /&gt;
 	char out[100]; &lt;br /&gt;
 	ostrstream str(out,sizeof(out)); &lt;br /&gt;
 	str &amp;amp;lt;&amp;amp;lt; BigIntegerVersion; &lt;br /&gt;
 	return *new string(out); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Converts `this&amp;#039; to a string representation &lt;br /&gt;
 string&amp;amp;amp; BigInteger::toString()const &lt;br /&gt;
 { &lt;br /&gt;
 	const int DIGITS = Digits()*4; &lt;br /&gt;
 	char *R = new char[DIGITS+2]; &lt;br /&gt;
 	ostrstream ostr(R,DIGITS); &lt;br /&gt;
 	ostr &amp;amp;lt;&amp;amp;lt; *this; &lt;br /&gt;
 	return *new string(R); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Converts `this&amp;#039; to equivalent int value &lt;br /&gt;
 int BigInteger::toInt() &lt;br /&gt;
 { &lt;br /&gt;
 	return (int)toLong(); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Converts `this&amp;#039; to equivalent 32 bit long value &lt;br /&gt;
 long BigInteger::toLong() &lt;br /&gt;
 { &lt;br /&gt;
 	long r = TheNumber[End]; &lt;br /&gt;
 	if(Digits()&amp;amp;gt;1) r += BASE * TheNumber[End-1] ; &lt;br /&gt;
 	if(Digits()&amp;amp;gt;2) r += BASE*BASE*(TheNumber[End-2]%100); &lt;br /&gt;
 	return r; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Postfix Increment , that is *this++ &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::operator++() &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger&amp;amp;amp; ONE = *new BigInteger(1l); &lt;br /&gt;
 	*this = *this+ONE; &lt;br /&gt;
 	return *this; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Prefix Increment , that is ++*this &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::operator++(int notused) &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger one(1l); &lt;br /&gt;
 	BigInteger&amp;amp;amp; Ret = *new BigInteger(*this); &lt;br /&gt;
 	*this = *this+one; &lt;br /&gt;
 	return Ret; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Postfix Decrement , that is *this-- &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::operator--() &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger one(1l); &lt;br /&gt;
 	*this = *this-one; &lt;br /&gt;
 	return *this; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Pretfix Increment , that is --*this &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::operator--(int notused) &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger one(1l); &lt;br /&gt;
 	BigInteger&amp;amp;amp; Ret = *new BigInteger(*this); &lt;br /&gt;
 	*this = *this-one; &lt;br /&gt;
 	return Ret; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Negation, returns -*this &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::operator-() &lt;br /&gt;
 { &lt;br /&gt;
 	this-&amp;amp;gt;isNegative = this-&amp;amp;gt;isNegative==true?false:true; &lt;br /&gt;
 	return *this; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Left Shift &lt;br /&gt;
 // To be checked &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::operator&amp;amp;lt;&amp;amp;lt;(SizeT b) &lt;br /&gt;
 { &lt;br /&gt;
 	SizeT i = (SizeT)(b / LOG10BASE); &lt;br /&gt;
 	b %= LOG10BASE; &lt;br /&gt;
 	while(b--) TheNumber[Digits()-1] *= 10; &lt;br /&gt;
 	&lt;br /&gt;
 	if(i&amp;amp;gt;0) &lt;br /&gt;
 	{ &lt;br /&gt;
 		DATATYPE *temp = new DATATYPE[Digits()+i]; &lt;br /&gt;
 		for(b=0;b&amp;amp;lt;Digits();b++) &lt;br /&gt;
 			temp[b] = TheNumber[b]; &lt;br /&gt;
 		for(b=0;b&amp;amp;lt;i; b++) &lt;br /&gt;
 			temp[Digits()+b] = 0; &lt;br /&gt;
 		delete [] TheNumber; &lt;br /&gt;
 		TheNumber = temp; &lt;br /&gt;
 		End += i-1; &lt;br /&gt;
 	} &lt;br /&gt;
 	return *this; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Right Shift &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::operator&amp;amp;gt;&amp;amp;gt;(SizeT b) &lt;br /&gt;
 { &lt;br /&gt;
 	SizeT i = (SizeT)(b / LOG10BASE); &lt;br /&gt;
 	b %= LOG10BASE; &lt;br /&gt;
 	End -= i; &lt;br /&gt;
 	while(b--) &lt;br /&gt;
 	{ &lt;br /&gt;
 		DATATYPE f = 0,l = 0; &lt;br /&gt;
 		for(i=Start;i&amp;amp;lt;=End;i++) &lt;br /&gt;
 		{ &lt;br /&gt;
 			l = TheNumber[i]%10; &lt;br /&gt;
 			TheNumber[i] = f*BASE + TheNumber[i]/10; &lt;br /&gt;
 			f = l; &lt;br /&gt;
 		} &lt;br /&gt;
 		if(TheNumber[Start]==0) &lt;br /&gt;
 			Start--; &lt;br /&gt;
 	} &lt;br /&gt;
 	return *this; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Makes `this&amp;#039; BigInteger value to absolute &lt;br /&gt;
 void BigInteger::abs() &lt;br /&gt;
 { isNegative = false; } &lt;br /&gt;
 &lt;br /&gt;
 // Returns new BigInteger value which is absolute &lt;br /&gt;
 // copy of `arg&amp;#039; &lt;br /&gt;
 BigInteger&amp;amp;amp; abs(BigInteger&amp;amp;amp; arg) &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger&amp;amp;amp; ret = *new BigInteger(arg); &lt;br /&gt;
 	ret.isNegative = false; &lt;br /&gt;
 	return ret; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 // Power BigInteger to the power Long &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::Power(long y) const &lt;br /&gt;
 { &lt;br /&gt;
 	long P; &lt;br /&gt;
 	BigInteger&amp;amp;amp; pow = *new BigInteger(1l); &lt;br /&gt;
 	BigInteger&amp;amp;amp; z = *new BigInteger(); &lt;br /&gt;
 	BigInteger&amp;amp;amp; ZERO = *new BigInteger(); &lt;br /&gt;
 	BigInteger&amp;amp;amp; ONE = *new BigInteger(1l); &lt;br /&gt;
 	P = y; &lt;br /&gt;
 	&lt;br /&gt;
 	if(y==0) return pow; &lt;br /&gt;
 	if(isZero()) return ZERO; &lt;br /&gt;
 	if(UnsignedCompareTo(ONE)==0) return ONE; &lt;br /&gt;
 	&lt;br /&gt;
 	z = *this; &lt;br /&gt;
 	while(P&amp;amp;gt;0) &lt;br /&gt;
 	{ &lt;br /&gt;
 		while(P%2==0) &lt;br /&gt;
 		{ &lt;br /&gt;
 			P /= 2; &lt;br /&gt;
 			z = z*z; &lt;br /&gt;
 		} &lt;br /&gt;
 		P--; &lt;br /&gt;
 		pow = pow*z; &lt;br /&gt;
 	} &lt;br /&gt;
 	return pow; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 void Dump(char const* s,enum BigMathERROR e) &lt;br /&gt;
 { &lt;br /&gt;
 	cerr &amp;amp;lt;&amp;amp;lt; BigIntegerVersion &amp;amp;lt;&amp;amp;lt; endl; &lt;br /&gt;
 	cerr &amp;amp;lt;&amp;amp;lt; &amp;quot;Exception: &amp;quot; &amp;amp;lt;&amp;amp;lt; BigIntErrDes[e-1] &amp;amp;lt;&amp;amp;lt; endl; &lt;br /&gt;
 	cerr &amp;amp;lt;&amp;amp;lt; &amp;quot;In function: &amp;quot; &amp;amp;lt;&amp;amp;lt; s &amp;amp;lt;&amp;amp;lt; endl; &lt;br /&gt;
 	cerr &amp;amp;lt;&amp;amp;lt; &amp;quot;Error Code: &amp;quot; &amp;amp;lt;&amp;amp;lt; e &amp;amp;lt;&amp;amp;lt; endl; &lt;br /&gt;
 	exit(e); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 string&amp;amp;amp; DumpString (char const* s,enum BigMathERROR e) &lt;br /&gt;
 { &lt;br /&gt;
 	char *R = new char[256]; &lt;br /&gt;
 	ostrstream ostr(R,255); &lt;br /&gt;
 	ostr &amp;amp;lt;&amp;amp;lt; BigIntegerVersion &amp;amp;lt;&amp;amp;lt; endl; &lt;br /&gt;
 	ostr &amp;amp;lt;&amp;amp;lt; &amp;quot;Exception: &amp;quot; &amp;amp;lt;&amp;amp;lt; BigIntErrDes[e-1] &amp;amp;lt;&amp;amp;lt; endl; &lt;br /&gt;
 	ostr &amp;amp;lt;&amp;amp;lt; &amp;quot;In function: &amp;quot; &amp;amp;lt;&amp;amp;lt; s &amp;amp;lt;&amp;amp;lt; endl; &lt;br /&gt;
 	ostr &amp;amp;lt;&amp;amp;lt; &amp;quot;Error Code: &amp;quot; &amp;amp;lt;&amp;amp;lt; e &amp;amp;lt;&amp;amp;lt; endl; &lt;br /&gt;
 	return *new string(R); &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 BigInteger&amp;amp;amp; BigInteger::SquareRoot() const &lt;br /&gt;
 { &lt;br /&gt;
 	BigInteger const&amp;amp;amp; n = *this; &lt;br /&gt;
 	BigInteger&amp;amp;amp; _2 = *new BigInteger(2l); &lt;br /&gt;
 	BigInteger&amp;amp;amp; zero = *new BigInteger(); &lt;br /&gt;
 	if(n.isZero()) &lt;br /&gt;
 		return zero; &lt;br /&gt;
 	&lt;br /&gt;
 	if(n.isNegative) &lt;br /&gt;
 		throw domain_error ( DumpString (&amp;quot;Square Root&amp;quot;,BigMathDomain) ); &lt;br /&gt;
 	&lt;br /&gt;
 	long Dig; &lt;br /&gt;
 	if(n.Digits()%2==0) &lt;br /&gt;
 		Dig = n.Digits()/2 - 1; &lt;br /&gt;
 	else &lt;br /&gt;
 		Dig = n.Digits()/2 ; &lt;br /&gt;
 	&lt;br /&gt;
 	BigInteger&amp;amp;amp; sq = *new BigInteger(1l); &lt;br /&gt;
 	if(Dig==-1) &lt;br /&gt;
 		return sq; &lt;br /&gt;
 	&lt;br /&gt;
 	BigInteger sqr,toIncrease,temp; &lt;br /&gt;
 	sq = sq &amp;amp;lt;&amp;amp;lt; Dig; &lt;br /&gt;
 	toIncrease = sq; &lt;br /&gt;
 	&lt;br /&gt;
 	while(true) &lt;br /&gt;
 	{ &lt;br /&gt;
 		sqr = sq*sq; &lt;br /&gt;
 		if(sqr.CompareTo(n) == 0) break; &lt;br /&gt;
 		if(toIncrease.CompareTo(zero)==0) break; &lt;br /&gt;
 		if(sqr.CompareTo(n) &amp;amp;gt; 0) &lt;br /&gt;
 		{ &lt;br /&gt;
 			toIncrease = toIncrease/_2; &lt;br /&gt;
 			sq = temp; &lt;br /&gt;
 		} &lt;br /&gt;
 		&lt;br /&gt;
 		temp = sq; &lt;br /&gt;
 		sq = sq + toIncrease; &lt;br /&gt;
 	} &lt;br /&gt;
 	return sq; &lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 bool operator==(BigInteger const&amp;amp;amp; a, BigInteger const&amp;amp;amp; b) &lt;br /&gt;
 { return a.CompareTo(b)==0; } &lt;br /&gt;
 &lt;br /&gt;
 bool operator!=(BigInteger const&amp;amp;amp; a, BigInteger const&amp;amp;amp; b) &lt;br /&gt;
 { return a.CompareTo(b)!=0; } &lt;br /&gt;
 &lt;br /&gt;
 bool operator&amp;amp;gt;=(BigInteger const&amp;amp;amp; a, BigInteger const&amp;amp;amp; b) &lt;br /&gt;
 { return a.CompareTo(b)&amp;amp;gt;=0; } &lt;br /&gt;
 &lt;br /&gt;
 bool operator&amp;amp;lt;=(BigInteger const&amp;amp;amp; a, BigInteger const&amp;amp;amp; b) &lt;br /&gt;
 { return a.CompareTo(b)&amp;amp;lt;=0; } &lt;br /&gt;
 &lt;br /&gt;
 bool operator&amp;amp;gt;(BigInteger const&amp;amp;amp; a, BigInteger const&amp;amp;amp; b) &lt;br /&gt;
 { return a.CompareTo(b)&amp;amp;gt;0; } &lt;br /&gt;
 &lt;br /&gt;
 bool operator&amp;amp;lt;(BigInteger const&amp;amp;amp; a, BigInteger const&amp;amp;amp; b) &lt;br /&gt;
 { return a.CompareTo(b)&amp;amp;lt;0; } &lt;br /&gt;
 } &lt;br /&gt;
----&lt;br /&gt;
[[경시대회준비반]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>