|
<html><head><title>dlib C++ Library - bigint_kernel_1.cpp</title></head><body bgcolor='white'><pre> |
|
<font color='#009900'>// Copyright (C) 2003 Davis E. King ([email protected]) |
|
</font><font color='#009900'>// License: Boost Software License See LICENSE.txt for the full license. |
|
</font><font color='#0000FF'>#ifndef</font> DLIB_BIGINT_KERNEL_1_CPp_ |
|
<font color='#0000FF'>#define</font> DLIB_BIGINT_KERNEL_1_CPp_ |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='bigint_kernel_1.h.html'>bigint_kernel_1.h</a>" |
|
|
|
<font color='#0000FF'>#include</font> <font color='#5555FF'><</font>iostream<font color='#5555FF'>></font> |
|
|
|
<font color='#0000FF'>namespace</font> dlib |
|
<b>{</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> <font color='#009900'>// member/friend function definitions |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1:: |
|
<b><a name='bigint_kernel_1'></a>bigint_kernel_1</b> <font face='Lucida Console'>(</font> |
|
<font face='Lucida Console'>)</font> : |
|
slack<font face='Lucida Console'>(</font><font color='#979000'>25</font><font face='Lucida Console'>)</font>, |
|
data<font face='Lucida Console'>(</font><font color='#0000FF'>new</font> data_record<font face='Lucida Console'>(</font>slack<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<b>{</b><b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1:: |
|
<b><a name='bigint_kernel_1'></a>bigint_kernel_1</b> <font face='Lucida Console'>(</font> |
|
uint32 value |
|
<font face='Lucida Console'>)</font> : |
|
slack<font face='Lucida Console'>(</font><font color='#979000'>25</font><font face='Lucida Console'>)</font>, |
|
data<font face='Lucida Console'>(</font><font color='#0000FF'>new</font> data_record<font face='Lucida Console'>(</font>slack<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>*</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>value<font color='#5555FF'>&</font><font color='#979000'>0xFFFF</font><font face='Lucida Console'>)</font>; |
|
<font color='#5555FF'>*</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font color='#5555FF'>+</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>value<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>16</font><font face='Lucida Console'>)</font><font color='#5555FF'>&</font><font color='#979000'>0xFFFF</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font color='#5555FF'>+</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> <font color='#979000'>2</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1:: |
|
<b><a name='bigint_kernel_1'></a>bigint_kernel_1</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> item |
|
<font face='Lucida Console'>)</font> : |
|
slack<font face='Lucida Console'>(</font><font color='#979000'>25</font><font face='Lucida Console'>)</font>, |
|
data<font face='Lucida Console'>(</font>item.data<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1:: |
|
~<b><a name='bigint_kernel_1'></a>bigint_kernel_1</b> <font face='Lucida Console'>(</font> |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>delete</font> data; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>+</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font> <font face='Lucida Console'>(</font> |
|
std::<font color='#BB00BB'>max</font><font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used,data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> slack |
|
<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>long_add</font><font face='Lucida Console'>(</font>data,rhs.data,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// if there are other references to our data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>std::<font color='#BB00BB'>max</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used,rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font face='Lucida Console'>)</font><font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#BB00BB'>long_add</font><font face='Lucida Console'>(</font>data,rhs.data,temp<font face='Lucida Console'>)</font>; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#009900'>// if data is not big enough for the result |
|
</font> <font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>size <font color='#5555FF'><</font><font color='#5555FF'>=</font> std::<font color='#BB00BB'>max</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used,rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>std::<font color='#BB00BB'>max</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used,rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font face='Lucida Console'>)</font><font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>long_add</font><font face='Lucida Console'>(</font>data,rhs.data,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>delete</font> data; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#009900'>// there is enough size and no references |
|
</font> <font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>long_add</font><font face='Lucida Console'>(</font>data,rhs.data,data<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>-</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font> <font face='Lucida Console'>(</font> |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>+</font> slack |
|
<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>long_sub</font><font face='Lucida Console'>(</font>data,rhs.data,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// if there are other references to this data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#BB00BB'>long_sub</font><font face='Lucida Console'>(</font>data,rhs.data,temp<font face='Lucida Console'>)</font>; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>long_sub</font><font face='Lucida Console'>(</font>data,rhs.data,data<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>*</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font> <font face='Lucida Console'>(</font> |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>+</font> rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>+</font> slack |
|
<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>long_mul</font><font face='Lucida Console'>(</font>data,rhs.data,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>*</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// create a data_record to store the result of the multiplication in |
|
</font> data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>long_mul</font><font face='Lucida Console'>(</font>data,rhs.data,temp<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// if there are other references to data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#0000FF'>delete</font> data; |
|
<b>}</b> |
|
data <font color='#5555FF'>=</font> temp; |
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>/</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data_record<font color='#5555FF'>*</font> remainder; |
|
<font color='#0000FF'>try</font> <b>{</b> |
|
remainder <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
<b>}</b> <font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>...<font face='Lucida Console'>)</font> <b>{</b> <font color='#0000FF'>delete</font> temp; <font color='#0000FF'>throw</font>; <b>}</b> |
|
|
|
<font color='#BB00BB'>long_div</font><font face='Lucida Console'>(</font>data,rhs.data,temp,remainder<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>delete</font> remainder; |
|
|
|
|
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>/</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
|
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data_record<font color='#5555FF'>*</font> remainder; |
|
<font color='#0000FF'>try</font> <b>{</b> |
|
remainder <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
<b>}</b> <font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>...<font face='Lucida Console'>)</font> <b>{</b> <font color='#0000FF'>delete</font> temp; <font color='#0000FF'>throw</font>; <b>}</b> |
|
|
|
<font color='#BB00BB'>long_div</font><font face='Lucida Console'>(</font>data,rhs.data,temp,remainder<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// check if there are other references to data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
<font color='#009900'>// if there are no references to data then it must be deleted |
|
</font> <font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#0000FF'>delete</font> data; |
|
<b>}</b> |
|
data <font color='#5555FF'>=</font> temp; |
|
<font color='#0000FF'>delete</font> remainder; |
|
|
|
|
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>%</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data_record<font color='#5555FF'>*</font> remainder; |
|
<font color='#0000FF'>try</font> <b>{</b> |
|
remainder <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
<b>}</b> <font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>...<font face='Lucida Console'>)</font> <b>{</b> <font color='#0000FF'>delete</font> temp; <font color='#0000FF'>throw</font>; <b>}</b> |
|
|
|
<font color='#BB00BB'>long_div</font><font face='Lucida Console'>(</font>data,rhs.data,temp,remainder<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>delete</font> temp; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>remainder,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>%</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data_record<font color='#5555FF'>*</font> remainder; |
|
<font color='#0000FF'>try</font> <b>{</b> |
|
remainder <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
<b>}</b> <font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>...<font face='Lucida Console'>)</font> <b>{</b> <font color='#0000FF'>delete</font> temp; <font color='#0000FF'>throw</font>; <b>}</b> |
|
|
|
<font color='#BB00BB'>long_div</font><font face='Lucida Console'>(</font>data,rhs.data,temp,remainder<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// check if there are other references to data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
<font color='#009900'>// if there are no references to data then it must be deleted |
|
</font> <font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#0000FF'>delete</font> data; |
|
<b>}</b> |
|
data <font color='#5555FF'>=</font> remainder; |
|
<font color='#0000FF'>delete</font> temp; |
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>bool</u></font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b> <font color='#5555FF'><</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>is_less_than</font><font face='Lucida Console'>(</font>data,rhs.data<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>bool</u></font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>is_equal_to</font><font face='Lucida Console'>(</font>data,rhs.data<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#0000FF'>this</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#5555FF'>&</font>rhs<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
|
|
<font color='#009900'>// if we have the only reference to our data then delete it |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>delete</font> data; |
|
data <font color='#5555FF'>=</font> rhs.data; |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
data <font color='#5555FF'>=</font> rhs.data; |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
std::ostream<font color='#5555FF'>&</font> <b><a name='operator'></a>operator</b><font color='#5555FF'><</font><font color='#5555FF'><</font> <font face='Lucida Console'>(</font> |
|
std::ostream<font color='#5555FF'>&</font> out_, |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
std::ostream <font color='#BB00BB'>out</font><font face='Lucida Console'>(</font>out_.<font color='#BB00BB'>rdbuf</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>typedef</font> bigint_kernel_1 bigint; |
|
|
|
bigint::data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> bigint::<font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>rhs.data,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
|
|
|
|
|
|
<font color='#009900'>// get a char array big enough to hold the number in ascii format |
|
</font> <font color='#0000FF'><u>char</u></font><font color='#5555FF'>*</font> str; |
|
<font color='#0000FF'>try</font> <b>{</b> |
|
str <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#0000FF'><u>char</u></font>[<font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font face='Lucida Console'>)</font><font color='#5555FF'>*</font><font color='#979000'>5</font><font color='#5555FF'>+</font><font color='#979000'>10</font>]; |
|
<b>}</b> <font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>...<font face='Lucida Console'>)</font> <b>{</b> <font color='#0000FF'>delete</font> temp; <font color='#0000FF'>throw</font>; <b>}</b> |
|
|
|
<font color='#0000FF'><u>char</u></font><font color='#5555FF'>*</font> str_start <font color='#5555FF'>=</font> str; |
|
str <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font face='Lucida Console'>)</font><font color='#5555FF'>*</font><font color='#979000'>5</font><font color='#5555FF'>+</font><font color='#979000'>9</font>; |
|
<font color='#5555FF'>*</font>str <font color='#5555FF'>=</font> <font color='#979000'>0</font>; <font color='#5555FF'>-</font><font color='#5555FF'>-</font>str; |
|
|
|
|
|
uint16 remainder; |
|
rhs.<font color='#BB00BB'>short_div</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>10000</font>,temp,remainder<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// pull the digits out of remainder |
|
</font> <font color='#0000FF'><u>char</u></font> a <font color='#5555FF'>=</font> remainder <font color='#5555FF'>%</font> <font color='#979000'>10</font> <font color='#5555FF'>+</font> '<font color='#FF0000'>0</font>'; |
|
remainder <font color='#5555FF'>/</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
<font color='#0000FF'><u>char</u></font> b <font color='#5555FF'>=</font> remainder <font color='#5555FF'>%</font> <font color='#979000'>10</font> <font color='#5555FF'>+</font> '<font color='#FF0000'>0</font>'; |
|
remainder <font color='#5555FF'>/</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
<font color='#0000FF'><u>char</u></font> c <font color='#5555FF'>=</font> remainder <font color='#5555FF'>%</font> <font color='#979000'>10</font> <font color='#5555FF'>+</font> '<font color='#FF0000'>0</font>'; |
|
remainder <font color='#5555FF'>/</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
<font color='#0000FF'><u>char</u></font> d <font color='#5555FF'>=</font> remainder <font color='#5555FF'>%</font> <font color='#979000'>10</font> <font color='#5555FF'>+</font> '<font color='#FF0000'>0</font>'; |
|
remainder <font color='#5555FF'>/</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
|
|
|
|
<font color='#5555FF'>*</font>str <font color='#5555FF'>=</font> a; <font color='#5555FF'>-</font><font color='#5555FF'>-</font>str; |
|
<font color='#5555FF'>*</font>str <font color='#5555FF'>=</font> b; <font color='#5555FF'>-</font><font color='#5555FF'>-</font>str; |
|
<font color='#5555FF'>*</font>str <font color='#5555FF'>=</font> c; <font color='#5555FF'>-</font><font color='#5555FF'>-</font>str; |
|
<font color='#5555FF'>*</font>str <font color='#5555FF'>=</font> d; <font color='#5555FF'>-</font><font color='#5555FF'>-</font>str; |
|
|
|
|
|
<font color='#009900'>// keep looping until temp represents zero |
|
</font> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> <font color='#5555FF'>*</font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
rhs.<font color='#BB00BB'>short_div</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>10000</font>,temp,remainder<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// pull the digits out of remainder |
|
</font> <font color='#0000FF'><u>char</u></font> a <font color='#5555FF'>=</font> remainder <font color='#5555FF'>%</font> <font color='#979000'>10</font> <font color='#5555FF'>+</font> '<font color='#FF0000'>0</font>'; |
|
remainder <font color='#5555FF'>/</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
<font color='#0000FF'><u>char</u></font> b <font color='#5555FF'>=</font> remainder <font color='#5555FF'>%</font> <font color='#979000'>10</font> <font color='#5555FF'>+</font> '<font color='#FF0000'>0</font>'; |
|
remainder <font color='#5555FF'>/</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
<font color='#0000FF'><u>char</u></font> c <font color='#5555FF'>=</font> remainder <font color='#5555FF'>%</font> <font color='#979000'>10</font> <font color='#5555FF'>+</font> '<font color='#FF0000'>0</font>'; |
|
remainder <font color='#5555FF'>/</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
<font color='#0000FF'><u>char</u></font> d <font color='#5555FF'>=</font> remainder <font color='#5555FF'>%</font> <font color='#979000'>10</font> <font color='#5555FF'>+</font> '<font color='#FF0000'>0</font>'; |
|
remainder <font color='#5555FF'>/</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
|
|
<font color='#5555FF'>*</font>str <font color='#5555FF'>=</font> a; <font color='#5555FF'>-</font><font color='#5555FF'>-</font>str; |
|
<font color='#5555FF'>*</font>str <font color='#5555FF'>=</font> b; <font color='#5555FF'>-</font><font color='#5555FF'>-</font>str; |
|
<font color='#5555FF'>*</font>str <font color='#5555FF'>=</font> c; <font color='#5555FF'>-</font><font color='#5555FF'>-</font>str; |
|
<font color='#5555FF'>*</font>str <font color='#5555FF'>=</font> d; <font color='#5555FF'>-</font><font color='#5555FF'>-</font>str; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// throw away and extra leading zeros |
|
</font> <font color='#5555FF'>+</font><font color='#5555FF'>+</font>str; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>str <font color='#5555FF'>=</font><font color='#5555FF'>=</font> '<font color='#FF0000'>0</font>'<font face='Lucida Console'>)</font> |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>str; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>str <font color='#5555FF'>=</font><font color='#5555FF'>=</font> '<font color='#FF0000'>0</font>'<font face='Lucida Console'>)</font> |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>str; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>str <font color='#5555FF'>=</font><font color='#5555FF'>=</font> '<font color='#FF0000'>0</font>'<font face='Lucida Console'>)</font> |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>str; |
|
|
|
|
|
|
|
|
|
out <font color='#5555FF'><</font><font color='#5555FF'><</font> str; |
|
<font color='#0000FF'>delete</font> [] str_start; |
|
<font color='#0000FF'>delete</font> temp; |
|
<font color='#0000FF'>return</font> out_; |
|
|
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
std::istream<font color='#5555FF'>&</font> <b><a name='operator'></a>operator</b><font color='#5555FF'>></font><font color='#5555FF'>></font> <font face='Lucida Console'>(</font> |
|
std::istream<font color='#5555FF'>&</font> in_, |
|
bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
std::istream <font color='#BB00BB'>in</font><font face='Lucida Console'>(</font>in_.<font color='#BB00BB'>rdbuf</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// ignore any leading whitespaces |
|
</font> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> '<font color='#FF0000'> </font>' <font color='#5555FF'>|</font><font color='#5555FF'>|</font> in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> '<font color='#FF0000'>\t</font>' <font color='#5555FF'>|</font><font color='#5555FF'>|</font> in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> '<font color='#FF0000'>\n</font>'<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
in.<font color='#BB00BB'>get</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// if the first digit is not an integer then this is an error |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font> <font color='#5555FF'>!</font><font face='Lucida Console'>(</font>in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>=</font> '<font color='#FF0000'>0</font>' <font color='#5555FF'>&</font><font color='#5555FF'>&</font> in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'>=</font> '<font color='#FF0000'>9</font>'<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
in_.<font color='#BB00BB'>clear</font><font face='Lucida Console'>(</font>std::ios::failbit<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> in_; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'><u>int</u></font> num_read; |
|
bigint_kernel_1 temp; |
|
<font color='#0000FF'>do</font> |
|
<b>{</b> |
|
|
|
<font color='#009900'>// try to get 4 chars from in |
|
</font> num_read <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'><u>char</u></font> a <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'><u>char</u></font> b <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'><u>char</u></font> c <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'><u>char</u></font> d <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>=</font> '<font color='#FF0000'>0</font>' <font color='#5555FF'>&</font><font color='#5555FF'>&</font> in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'>=</font> '<font color='#FF0000'>9</font>'<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
num_read <font color='#5555FF'>*</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
a <font color='#5555FF'>=</font> in.<font color='#BB00BB'>get</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>=</font> '<font color='#FF0000'>0</font>' <font color='#5555FF'>&</font><font color='#5555FF'>&</font> in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'>=</font> '<font color='#FF0000'>9</font>'<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
num_read <font color='#5555FF'>*</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
b <font color='#5555FF'>=</font> in.<font color='#BB00BB'>get</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>=</font> '<font color='#FF0000'>0</font>' <font color='#5555FF'>&</font><font color='#5555FF'>&</font> in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'>=</font> '<font color='#FF0000'>9</font>'<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
num_read <font color='#5555FF'>*</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
c <font color='#5555FF'>=</font> in.<font color='#BB00BB'>get</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>=</font> '<font color='#FF0000'>0</font>' <font color='#5555FF'>&</font><font color='#5555FF'>&</font> in.<font color='#BB00BB'>peek</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'>=</font> '<font color='#FF0000'>9</font>'<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
num_read <font color='#5555FF'>*</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
d <font color='#5555FF'>=</font> in.<font color='#BB00BB'>get</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// merge the for digits into an uint16 |
|
</font> uint16 num <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>a <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
num <font color='#5555FF'>=</font> a <font color='#5555FF'>-</font> '<font color='#FF0000'>0</font>'; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>b <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
num <font color='#5555FF'>*</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
num <font color='#5555FF'>+</font><font color='#5555FF'>=</font> b <font color='#5555FF'>-</font> '<font color='#FF0000'>0</font>'; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>c <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
num <font color='#5555FF'>*</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
num <font color='#5555FF'>+</font><font color='#5555FF'>=</font> c <font color='#5555FF'>-</font> '<font color='#FF0000'>0</font>'; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>d <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
num <font color='#5555FF'>*</font><font color='#5555FF'>=</font> <font color='#979000'>10</font>; |
|
num <font color='#5555FF'>+</font><font color='#5555FF'>=</font> d <font color='#5555FF'>-</font> '<font color='#FF0000'>0</font>'; |
|
<b>}</b> |
|
|
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>num_read <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// shift the digits in temp left by the number of new digits we just read |
|
</font> temp <font color='#5555FF'>*</font><font color='#5555FF'>=</font> num_read; |
|
<font color='#009900'>// add in new digits |
|
</font> temp <font color='#5555FF'>+</font><font color='#5555FF'>=</font> num; |
|
<b>}</b> |
|
|
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>num_read <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>10000</font><font face='Lucida Console'>)</font>; |
|
|
|
|
|
rhs <font color='#5555FF'>=</font> temp; |
|
<font color='#0000FF'>return</font> in_; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 <b><a name='operator'></a>operator</b><font color='#5555FF'>+</font> <font face='Lucida Console'>(</font> |
|
uint16 lhs, |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>typedef</font> bigint_kernel_1 bigint; |
|
bigint::data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> bigint::<font color='#BB00BB'>data_record</font> |
|
<font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>rhs.slack<font face='Lucida Console'>)</font>; |
|
|
|
rhs.<font color='#BB00BB'>short_add</font><font face='Lucida Console'>(</font>rhs.data,lhs,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 <b><a name='operator'></a>operator</b><font color='#5555FF'>+</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> lhs, |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>typedef</font> bigint_kernel_1 bigint; |
|
bigint::data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> bigint::<font color='#BB00BB'>data_record</font> |
|
<font face='Lucida Console'>(</font>lhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>lhs.slack<font face='Lucida Console'>)</font>; |
|
|
|
lhs.<font color='#BB00BB'>short_add</font><font face='Lucida Console'>(</font>lhs.data,rhs,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// if there are other references to this data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#BB00BB'>short_add</font><font face='Lucida Console'>(</font>data,rhs,temp<font face='Lucida Console'>)</font>; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#009900'>// or if we need to enlarge data then do so |
|
</font> <font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font><font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>size<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>short_add</font><font face='Lucida Console'>(</font>data,rhs,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>delete</font> data; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#009900'>// or if there is plenty of space and no references |
|
</font> <font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>short_add</font><font face='Lucida Console'>(</font>data,rhs,data<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 <b><a name='operator'></a>operator</b><font color='#5555FF'>-</font> <font face='Lucida Console'>(</font> |
|
uint16 lhs, |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>typedef</font> bigint_kernel_1 bigint; |
|
bigint::data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> bigint::<font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>rhs.slack<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#5555FF'>*</font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> lhs <font color='#5555FF'>-</font> <font color='#5555FF'>*</font><font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 <b><a name='operator'></a>operator</b><font color='#5555FF'>-</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> lhs, |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>typedef</font> bigint_kernel_1 bigint; |
|
bigint::data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> bigint::<font color='#BB00BB'>data_record</font> |
|
<font face='Lucida Console'>(</font>lhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>lhs.slack<font face='Lucida Console'>)</font>; |
|
|
|
lhs.<font color='#BB00BB'>short_sub</font><font face='Lucida Console'>(</font>lhs.data,rhs,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// if there are other references to this data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#BB00BB'>short_sub</font><font face='Lucida Console'>(</font>data,rhs,temp<font face='Lucida Console'>)</font>; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>short_sub</font><font face='Lucida Console'>(</font>data,rhs,data<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 <b><a name='operator'></a>operator</b><font color='#5555FF'>*</font> <font face='Lucida Console'>(</font> |
|
uint16 lhs, |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>typedef</font> bigint_kernel_1 bigint; |
|
bigint::data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> bigint::<font color='#BB00BB'>data_record</font> |
|
<font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>rhs.slack<font face='Lucida Console'>)</font>; |
|
|
|
rhs.<font color='#BB00BB'>short_mul</font><font face='Lucida Console'>(</font>rhs.data,lhs,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 <b><a name='operator'></a>operator</b><font color='#5555FF'>*</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> lhs, |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>typedef</font> bigint_kernel_1 bigint; |
|
bigint::data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> bigint::<font color='#BB00BB'>data_record</font> |
|
<font face='Lucida Console'>(</font>lhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>lhs.slack<font face='Lucida Console'>)</font>; |
|
|
|
lhs.<font color='#BB00BB'>short_mul</font><font face='Lucida Console'>(</font>lhs.data,rhs,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>*</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// if there are other references to this data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#BB00BB'>short_mul</font><font face='Lucida Console'>(</font>data,rhs,temp<font face='Lucida Console'>)</font>; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#009900'>// or if we need to enlarge data |
|
</font> <font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font><font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>size<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>short_mul</font><font face='Lucida Console'>(</font>data,rhs,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>delete</font> data; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>short_mul</font><font face='Lucida Console'>(</font>data,rhs,data<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 <b><a name='operator'></a>operator</b><font color='#5555FF'>/</font> <font face='Lucida Console'>(</font> |
|
uint16 lhs, |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>typedef</font> bigint_kernel_1 bigint; |
|
bigint::data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> bigint::<font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>rhs.slack<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// if rhs might not be bigger than lhs |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>*</font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> lhs<font color='#5555FF'>/</font> <font color='#5555FF'>*</font><font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 <b><a name='operator'></a>operator</b><font color='#5555FF'>/</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> lhs, |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>typedef</font> bigint_kernel_1 bigint; |
|
bigint::data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> bigint::<font color='#BB00BB'>data_record</font> |
|
<font face='Lucida Console'>(</font>lhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>lhs.slack<font face='Lucida Console'>)</font>; |
|
|
|
uint16 remainder; |
|
lhs.<font color='#BB00BB'>short_div</font><font face='Lucida Console'>(</font>lhs.data,rhs,temp,remainder<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>/</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
uint16 remainder; |
|
<font color='#009900'>// if there are other references to this data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#BB00BB'>short_div</font><font face='Lucida Console'>(</font>data,rhs,temp,remainder<font face='Lucida Console'>)</font>; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>short_div</font><font face='Lucida Console'>(</font>data,rhs,data,remainder<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 <b><a name='operator'></a>operator</b><font color='#5555FF'>%</font> <font face='Lucida Console'>(</font> |
|
uint16 lhs, |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>typedef</font> bigint_kernel_1 bigint; |
|
<font color='#009900'>// temp is zero by default |
|
</font> bigint::data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> bigint::<font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>rhs.slack<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// if rhs is just an uint16 inside then perform the modulus |
|
</font> <font color='#5555FF'>*</font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> lhs <font color='#5555FF'>%</font> <font color='#5555FF'>*</font><font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#009900'>// if rhs is bigger than lhs then the answer is lhs |
|
</font> <font color='#5555FF'>*</font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> lhs; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 <b><a name='operator'></a>operator</b><font color='#5555FF'>%</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> lhs, |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>typedef</font> bigint_kernel_1 bigint; |
|
bigint::data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> bigint::<font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>lhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>lhs.slack<font face='Lucida Console'>)</font>; |
|
|
|
uint16 remainder; |
|
|
|
lhs.<font color='#BB00BB'>short_div</font><font face='Lucida Console'>(</font>lhs.data,rhs,temp,remainder<font face='Lucida Console'>)</font>; |
|
temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#5555FF'>*</font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> remainder; |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>%</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
uint16 remainder; |
|
<font color='#009900'>// if there are other references to this data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#BB00BB'>short_div</font><font face='Lucida Console'>(</font>data,rhs,temp,remainder<font face='Lucida Console'>)</font>; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>short_div</font><font face='Lucida Console'>(</font>data,rhs,data,remainder<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#5555FF'>*</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> remainder; |
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>bool</u></font> <b><a name='operator'></a>operator</b> <font color='#5555FF'><</font> <font face='Lucida Console'>(</font> |
|
uint16 lhs, |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>></font> <font color='#979000'>1</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> lhs <font color='#5555FF'><</font> <font color='#5555FF'>*</font><font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>bool</u></font> <b><a name='operator'></a>operator</b> <font color='#5555FF'><</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> lhs, |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font face='Lucida Console'>(</font>lhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> <font color='#5555FF'>*</font><font face='Lucida Console'>(</font>lhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'><</font> rhs<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>bool</u></font> <b><a name='operator'></a>operator</b> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> lhs, |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font face='Lucida Console'>(</font>lhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> <font color='#5555FF'>*</font><font face='Lucida Console'>(</font>lhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> rhs<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>bool</u></font> <b><a name='operator'></a>operator</b> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
uint16 lhs, |
|
<font color='#0000FF'>const</font> bigint_kernel_1<font color='#5555FF'>&</font> rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> <font color='#5555FF'>*</font><font face='Lucida Console'>(</font>rhs.data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> lhs<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font> |
|
uint16 rhs |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// check if there are other references to our data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>try</font> <b>{</b> |
|
data <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>slack<font face='Lucida Console'>)</font>; |
|
<b>}</b> <font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>...<font face='Lucida Console'>)</font> <b>{</b> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>+</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; <font color='#0000FF'>throw</font>; <b>}</b> |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
|
|
<font color='#5555FF'>*</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> rhs; |
|
|
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>+</font><font color='#5555FF'>+</font> <font face='Lucida Console'>(</font> |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// if there are other references to this data then make a copy of it |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#BB00BB'>increment</font><font face='Lucida Console'>(</font>data,temp<font face='Lucida Console'>)</font>; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#009900'>// or if we need to enlarge data then do so |
|
</font> <font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font><font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>size<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>increment</font><font face='Lucida Console'>(</font>data,temp<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>delete</font> data; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>increment</font><font face='Lucida Console'>(</font>data,data<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>+</font><font color='#5555FF'>+</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>int</u></font> |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp; <font color='#009900'>// this is the copy of temp we will return in the end |
|
</font> |
|
data_record<font color='#5555FF'>*</font> temp2 <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>increment</font><font face='Lucida Console'>(</font>data,temp2<font face='Lucida Console'>)</font>; |
|
|
|
temp <font color='#5555FF'>=</font> data; |
|
data <font color='#5555FF'>=</font> temp2; |
|
|
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
bigint_kernel_1<font color='#5555FF'>&</font> bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>-</font><font color='#5555FF'>-</font> <font face='Lucida Console'>(</font> |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// if there are other references to this data |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
data<font color='#5555FF'>-</font><font color='#5555FF'>></font>references <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#BB00BB'>decrement</font><font face='Lucida Console'>(</font>data,temp<font face='Lucida Console'>)</font>; |
|
data <font color='#5555FF'>=</font> temp; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>decrement</font><font face='Lucida Console'>(</font>data,data<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>return</font> <font color='#5555FF'>*</font><font color='#0000FF'>this</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'>const</font> bigint_kernel_1 bigint_kernel_1:: |
|
<b><a name='operator'></a>operator</b><font color='#5555FF'>-</font><font color='#5555FF'>-</font> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'><u>int</u></font> |
|
<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
data_record<font color='#5555FF'>*</font> temp; <font color='#009900'>// this is the copy of temp we will return in the end |
|
</font> |
|
data_record<font color='#5555FF'>*</font> temp2 <font color='#5555FF'>=</font> <font color='#0000FF'>new</font> <font color='#BB00BB'>data_record</font><font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>decrement</font><font face='Lucida Console'>(</font>data,temp2<font face='Lucida Console'>)</font>; |
|
|
|
temp <font color='#5555FF'>=</font> data; |
|
data <font color='#5555FF'>=</font> temp2; |
|
|
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>bigint_kernel_1</font><font face='Lucida Console'>(</font>temp,<font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> <font color='#009900'>// private member function definitions |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font><font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='short_add'></a>short_add</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> data, |
|
uint16 value, |
|
data_record<font color='#5555FF'>*</font> result |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
<font color='#009900'>// put value into the carry part of temp |
|
</font> uint32 temp <font color='#5555FF'>=</font> value; |
|
temp <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> <font color='#979000'>16</font>; |
|
|
|
|
|
<font color='#0000FF'>const</font> uint16<font color='#5555FF'>*</font> number <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
<font color='#0000FF'>const</font> uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> number <font color='#5555FF'>+</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; <font color='#009900'>// one past the end of number |
|
</font> uint16<font color='#5555FF'>*</font> r <font color='#5555FF'>=</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>number <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// add *number and the current carry |
|
</font> temp <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>number <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
<font color='#009900'>// put the low word of temp into *r |
|
</font> <font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp <font color='#5555FF'>&</font> <font color='#979000'>0xFFFF</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>number; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>r; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// if there is a final carry |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>16</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>+</font> <font color='#979000'>1</font>; |
|
<font color='#009900'>// store the carry in the most significant digit of the result |
|
</font> <font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='short_sub'></a>short_sub</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> data, |
|
uint16 value, |
|
data_record<font color='#5555FF'>*</font> result |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
|
|
|
|
<font color='#0000FF'>const</font> uint16<font color='#5555FF'>*</font> number <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
<font color='#0000FF'>const</font> uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> number <font color='#5555FF'>+</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>-</font> <font color='#979000'>1</font>; |
|
uint16<font color='#5555FF'>*</font> r <font color='#5555FF'>=</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
|
|
uint32 temp <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>number <font color='#5555FF'>-</font> value; |
|
|
|
<font color='#009900'>// put the low word of temp into *data |
|
</font> <font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp <font color='#5555FF'>&</font> <font color='#979000'>0xFFFF</font><font face='Lucida Console'>)</font>; |
|
|
|
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>number <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>number; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>r; |
|
|
|
<font color='#009900'>// subtract the carry from *number |
|
</font> temp <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>number <font color='#5555FF'>-</font> <font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>31</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// put the low word of temp into *r |
|
</font> <font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp <font color='#5555FF'>&</font> <font color='#979000'>0xFFFF</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// if we lost a digit in the subtraction |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>r <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>else</font> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>-</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<b>}</b> |
|
|
|
|
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='short_mul'></a>short_mul</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> data, |
|
uint16 value, |
|
data_record<font color='#5555FF'>*</font> result |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
|
|
uint32 temp <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
|
|
|
|
<font color='#0000FF'>const</font> uint16<font color='#5555FF'>*</font> number <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
uint16<font color='#5555FF'>*</font> r <font color='#5555FF'>=</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
<font color='#0000FF'>const</font> uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> r <font color='#5555FF'>+</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
|
|
|
|
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font> r <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
|
|
<font color='#009900'>// multiply *data and value and add in the carry |
|
</font> temp <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>number<font color='#5555FF'>*</font><font face='Lucida Console'>(</font>uint32<font face='Lucida Console'>)</font>value <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// put the low word of temp into *data |
|
</font> <font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp <font color='#5555FF'>&</font> <font color='#979000'>0xFFFF</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>number; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>r; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// if there is a final carry |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>16</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>+</font> <font color='#979000'>1</font>; |
|
<font color='#009900'>// put the final carry into the most significant digit of the result |
|
</font> <font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<b>}</b> |
|
|
|
|
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='short_div'></a>short_div</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> data, |
|
uint16 value, |
|
data_record<font color='#5555FF'>*</font> result, |
|
uint16<font color='#5555FF'>&</font> rem |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
|
|
uint16 remainder <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
uint32 temp; |
|
|
|
|
|
|
|
<font color='#0000FF'>const</font> uint16<font color='#5555FF'>*</font> number <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number <font color='#5555FF'>+</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>-</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>const</font> uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> number <font color='#5555FF'>-</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
uint16<font color='#5555FF'>*</font> r <font color='#5555FF'>=</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number <font color='#5555FF'>+</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>-</font> <font color='#979000'>1</font>; |
|
|
|
|
|
<font color='#009900'>// if we are losing a digit in this division |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>number <font color='#5555FF'><</font> value<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>else</font> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>-</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<b>}</b> |
|
|
|
|
|
<font color='#009900'>// perform the actual division |
|
</font> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>number <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
|
|
temp <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>number <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>uint32<font face='Lucida Console'>)</font>remainder<font face='Lucida Console'>)</font><font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>/</font>value<font face='Lucida Console'>)</font>; |
|
remainder <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>%</font>value<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#5555FF'>-</font><font color='#5555FF'>-</font>number; |
|
<font color='#5555FF'>-</font><font color='#5555FF'>-</font>r; |
|
<b>}</b> |
|
|
|
rem <font color='#5555FF'>=</font> remainder; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='long_add'></a>long_add</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> lhs, |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> rhs, |
|
data_record<font color='#5555FF'>*</font> result |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
<font color='#009900'>// put value into the carry part of temp |
|
</font> uint32 temp<font color='#5555FF'>=</font><font color='#979000'>0</font>; |
|
|
|
uint16<font color='#5555FF'>*</font> min_num; <font color='#009900'>// the number with the least digits used |
|
</font> uint16<font color='#5555FF'>*</font> max_num; <font color='#009900'>// the number with the most digits used |
|
</font> uint16<font color='#5555FF'>*</font> min_end; <font color='#009900'>// one past the end of min_num |
|
</font> uint16<font color='#5555FF'>*</font> max_end; <font color='#009900'>// one past the end of max_num |
|
</font> uint16<font color='#5555FF'>*</font> r <font color='#5555FF'>=</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
|
|
uint32 max_digits_used; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'><</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
max_digits_used <font color='#5555FF'>=</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
min_num <font color='#5555FF'>=</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
max_num <font color='#5555FF'>=</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
min_end <font color='#5555FF'>=</font> min_num <font color='#5555FF'>+</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
max_end <font color='#5555FF'>=</font> max_num <font color='#5555FF'>+</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
max_digits_used <font color='#5555FF'>=</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
min_num <font color='#5555FF'>=</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
max_num <font color='#5555FF'>=</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
min_end <font color='#5555FF'>=</font> min_num <font color='#5555FF'>+</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
max_end <font color='#5555FF'>=</font> max_num <font color='#5555FF'>+</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<b>}</b> |
|
|
|
|
|
|
|
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>min_num <font color='#5555FF'>!</font><font color='#5555FF'>=</font> min_end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// add *min_num, *max_num and the current carry |
|
</font> temp <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>min_num <font color='#5555FF'>+</font> <font color='#5555FF'>*</font>max_num <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
<font color='#009900'>// put the low word of temp into *r |
|
</font> <font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp <font color='#5555FF'>&</font> <font color='#979000'>0xFFFF</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>min_num; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>max_num; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>r; |
|
<b>}</b> |
|
|
|
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>max_num <font color='#5555FF'>!</font><font color='#5555FF'>=</font> max_end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// add *max_num and the current carry |
|
</font> temp <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>max_num <font color='#5555FF'>+</font> <font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
<font color='#009900'>// put the low word of temp into *r |
|
</font> <font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp <font color='#5555FF'>&</font> <font color='#979000'>0xFFFF</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>max_num; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>r; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// check if there was a final carry |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>16</font><font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> max_digits_used <font color='#5555FF'>+</font> <font color='#979000'>1</font>; |
|
<font color='#009900'>// put the carry into the most significant digit in the result |
|
</font> <font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>16</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> max_digits_used; |
|
<b>}</b> |
|
|
|
|
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='long_sub'></a>long_sub</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> lhs, |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> rhs, |
|
data_record<font color='#5555FF'>*</font> result |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
|
|
|
|
<font color='#0000FF'>const</font> uint16<font color='#5555FF'>*</font> number1 <font color='#5555FF'>=</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
<font color='#0000FF'>const</font> uint16<font color='#5555FF'>*</font> number2 <font color='#5555FF'>=</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
<font color='#0000FF'>const</font> uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> number2 <font color='#5555FF'>+</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
uint16<font color='#5555FF'>*</font> r <font color='#5555FF'>=</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
|
|
|
|
|
|
uint32 temp <font color='#5555FF'>=</font><font color='#979000'>0</font>; |
|
|
|
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>number2 <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
|
|
<font color='#009900'>// subtract *number2 from *number1 and then subtract any carry |
|
</font> temp <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>number1 <font color='#5555FF'>-</font> <font color='#5555FF'>*</font>number2 <font color='#5555FF'>-</font> <font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>31</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// put the low word of temp into *r |
|
</font> <font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp <font color='#5555FF'>&</font> <font color='#979000'>0xFFFF</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>number1; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>number2; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>r; |
|
<b>}</b> |
|
|
|
end <font color='#5555FF'>=</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number <font color='#5555FF'>+</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>number1 <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
|
|
<font color='#009900'>// subtract the carry from *number1 |
|
</font> temp <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>number1 <font color='#5555FF'>-</font> <font face='Lucida Console'>(</font>temp<font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#979000'>31</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// put the low word of temp into *r |
|
</font> <font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#0000FF'>static_cast</font><font color='#5555FF'><</font>uint16<font color='#5555FF'>></font><font face='Lucida Console'>(</font>temp <font color='#5555FF'>&</font> <font color='#979000'>0xFFFF</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>number1; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>r; |
|
<b>}</b> |
|
|
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<font color='#009900'>// adjust the number of digits used appropriately |
|
</font> <font color='#5555FF'>-</font><font color='#5555FF'>-</font>r; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>r <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>></font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>-</font><font color='#5555FF'>-</font>r; |
|
<font color='#5555FF'>-</font><font color='#5555FF'>-</font>result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='long_div'></a>long_div</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> lhs, |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> rhs, |
|
data_record<font color='#5555FF'>*</font> result, |
|
data_record<font color='#5555FF'>*</font> remainder |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
<font color='#009900'>// zero result |
|
</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#5555FF'>*</font><font face='Lucida Console'>(</font>result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
|
|
uint16<font color='#5555FF'>*</font> a; |
|
uint16<font color='#5555FF'>*</font> b; |
|
uint16<font color='#5555FF'>*</font> end; |
|
|
|
<font color='#009900'>// copy lhs into remainder |
|
</font> remainder<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
a <font color='#5555FF'>=</font> remainder<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
end <font color='#5555FF'>=</font> a <font color='#5555FF'>+</font> remainder<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
b <font color='#5555FF'>=</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>a <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>*</font>a <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>b; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>a; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>b; |
|
<b>}</b> |
|
|
|
|
|
<font color='#009900'>// if rhs is bigger than lhs then result == 0 and remainder == lhs |
|
</font> <font color='#009900'>// so then we can quit right now |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>is_less_than</font><font face='Lucida Console'>(</font>lhs,rhs<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>return</font>; |
|
<b>}</b> |
|
|
|
|
|
<font color='#009900'>// make a temporary number |
|
</font> data_record <font color='#BB00BB'>temp</font><font face='Lucida Console'>(</font>lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>+</font> slack<font face='Lucida Console'>)</font>; |
|
|
|
|
|
<font color='#009900'>// shift rhs left until it is one shift away from being larger than lhs and |
|
</font> <font color='#009900'>// put the number of left shifts necessary into shifts |
|
</font> uint32 shifts; |
|
shifts <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>-</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font face='Lucida Console'>)</font> <font color='#5555FF'>*</font> <font color='#979000'>16</font>; |
|
|
|
<font color='#BB00BB'>shift_left</font><font face='Lucida Console'>(</font>rhs,<font color='#5555FF'>&</font>temp,shifts<font face='Lucida Console'>)</font>; |
|
|
|
|
|
<font color='#009900'>// while (lhs > temp) |
|
</font> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>is_less_than</font><font face='Lucida Console'>(</font><font color='#5555FF'>&</font>temp,lhs<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>shift_left</font><font face='Lucida Console'>(</font><font color='#5555FF'>&</font>temp,<font color='#5555FF'>&</font>temp,<font color='#979000'>1</font><font face='Lucida Console'>)</font>; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>shifts; |
|
<b>}</b> |
|
<font color='#009900'>// make sure lhs isn't smaller than temp |
|
</font> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>is_less_than</font><font face='Lucida Console'>(</font>lhs,<font color='#5555FF'>&</font>temp<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>shift_right</font><font face='Lucida Console'>(</font><font color='#5555FF'>&</font>temp,<font color='#5555FF'>&</font>temp<font face='Lucida Console'>)</font>; |
|
<font color='#5555FF'>-</font><font color='#5555FF'>-</font>shifts; |
|
<b>}</b> |
|
|
|
|
|
|
|
<font color='#009900'>// we want to execute the loop shifts +1 times |
|
</font> <font color='#5555FF'>+</font><font color='#5555FF'>+</font>shifts; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>shifts <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>shift_left</font><font face='Lucida Console'>(</font>result,result,<font color='#979000'>1</font><font face='Lucida Console'>)</font>; |
|
<font color='#009900'>// if (temp <= remainder) |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font><font color='#BB00BB'>is_less_than</font><font face='Lucida Console'>(</font>remainder,<font color='#5555FF'>&</font>temp<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>long_sub</font><font face='Lucida Console'>(</font>remainder,<font color='#5555FF'>&</font>temp,remainder<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>// increment result |
|
</font> uint16<font color='#5555FF'>*</font> r <font color='#5555FF'>=</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> r <font color='#5555FF'>+</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>true</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>r<font face='Lucida Console'>)</font>; |
|
<font color='#009900'>// if there was no carry then we are done |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>r <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>break</font>; |
|
|
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>r; |
|
|
|
<font color='#009900'>// if we hit the end of r and there is still a carry then |
|
</font> <font color='#009900'>// the next digit of r is 1 and there is one more digit used |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>r <font color='#5555FF'>=</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>(</font>result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<b>}</b> |
|
<b>}</b> |
|
<font color='#BB00BB'>shift_right</font><font face='Lucida Console'>(</font><font color='#5555FF'>&</font>temp,<font color='#5555FF'>&</font>temp<font face='Lucida Console'>)</font>; |
|
<font color='#5555FF'>-</font><font color='#5555FF'>-</font>shifts; |
|
<b>}</b> |
|
|
|
|
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='long_mul'></a>long_mul</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> lhs, |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> rhs, |
|
data_record<font color='#5555FF'>*</font> result |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
<font color='#009900'>// make result be zero |
|
</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#5555FF'>*</font><font face='Lucida Console'>(</font>result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
|
|
|
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> aa; |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> bb; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'><</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// make copies of lhs and rhs and give them an appropriate amount of |
|
</font> <font color='#009900'>// extra memory so there won't be any overflows |
|
</font> aa <font color='#5555FF'>=</font> lhs; |
|
bb <font color='#5555FF'>=</font> rhs; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#009900'>// make copies of lhs and rhs and give them an appropriate amount of |
|
</font> <font color='#009900'>// extra memory so there won't be any overflows |
|
</font> aa <font color='#5555FF'>=</font> rhs; |
|
bb <font color='#5555FF'>=</font> lhs; |
|
<b>}</b> |
|
<font color='#009900'>// this is where we actually copy lhs and rhs |
|
</font> data_record <font color='#BB00BB'>b</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>bb,aa<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used<font color='#5555FF'>+</font>slack<font face='Lucida Console'>)</font>; <font color='#009900'>// the larger(approximately) of lhs and rhs |
|
</font> |
|
|
|
uint32 shift_value <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
uint16<font color='#5555FF'>*</font> anum <font color='#5555FF'>=</font> aa<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> anum <font color='#5555FF'>+</font> aa<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>anum <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end <font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
uint16 bit <font color='#5555FF'>=</font> <font color='#979000'>0x0001</font>; |
|
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'><</font> <font color='#979000'>16</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// if the specified bit of a is 1 |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>anum <font color='#5555FF'>&</font> bit<font face='Lucida Console'>)</font> <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#BB00BB'>shift_left</font><font face='Lucida Console'>(</font><font color='#5555FF'>&</font>b,<font color='#5555FF'>&</font>b,shift_value<font face='Lucida Console'>)</font>; |
|
shift_value <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#BB00BB'>long_add</font><font face='Lucida Console'>(</font><font color='#5555FF'>&</font>b,result,result<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>shift_value; |
|
bit <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
|
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>anum; |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='shift_left'></a>shift_left</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> data, |
|
data_record<font color='#5555FF'>*</font> result, |
|
uint32 shift_amount |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
uint32 offset <font color='#5555FF'>=</font> shift_amount<font color='#5555FF'>/</font><font color='#979000'>16</font>; |
|
shift_amount <font color='#5555FF'>&</font><font color='#5555FF'>=</font> <font color='#979000'>0xf</font>; <font color='#009900'>// same as shift_amount %= 16; |
|
</font> |
|
uint16<font color='#5555FF'>*</font> r <font color='#5555FF'>=</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number <font color='#5555FF'>+</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>+</font> offset; <font color='#009900'>// result |
|
</font> uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
uint16<font color='#5555FF'>*</font> s <font color='#5555FF'>=</font> end <font color='#5555FF'>+</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; <font color='#009900'>// source |
|
</font> <font color='#0000FF'>const</font> uint32 temp <font color='#5555FF'>=</font> <font color='#979000'>16</font> <font color='#5555FF'>-</font> shift_amount; |
|
|
|
<font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#5555FF'>-</font>s<font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> temp<font face='Lucida Console'>)</font>; |
|
<font color='#009900'>// set the number of digits used in the result |
|
</font> <font color='#009900'>// if the upper bits from *s were zero then don't count this first word |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>r <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>+</font> offset; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>+</font> offset <font color='#5555FF'>+</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
<font color='#5555FF'>-</font><font color='#5555FF'>-</font>r; |
|
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>s <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font>s <font color='#5555FF'><</font><font color='#5555FF'><</font> shift_amount<font face='Lucida Console'>)</font> <font color='#5555FF'>|</font> <font face='Lucida Console'>(</font> <font color='#5555FF'>*</font><font face='Lucida Console'>(</font>s<font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>></font><font color='#5555FF'>></font> temp<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#5555FF'>-</font><font color='#5555FF'>-</font>r; |
|
<font color='#5555FF'>-</font><font color='#5555FF'>-</font>s; |
|
<b>}</b> |
|
<font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>s <font color='#5555FF'><</font><font color='#5555FF'><</font> shift_amount; |
|
|
|
<font color='#009900'>// now zero the rest of the result |
|
</font> end <font color='#5555FF'>=</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>r <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<font color='#5555FF'>*</font><font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#5555FF'>-</font>r<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
|
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='shift_right'></a>shift_right</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> data, |
|
data_record<font color='#5555FF'>*</font> result |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
|
|
uint16<font color='#5555FF'>*</font> r <font color='#5555FF'>=</font> result<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; <font color='#009900'>// result |
|
</font> uint16<font color='#5555FF'>*</font> s <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; <font color='#009900'>// source |
|
</font> uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> s <font color='#5555FF'>+</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>-</font> <font color='#979000'>1</font>; |
|
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>s <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>s <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>|</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font face='Lucida Console'>(</font>s<font color='#5555FF'>+</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#979000'>15</font><font face='Lucida Console'>)</font>; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>r; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>s; |
|
<b>}</b> |
|
<font color='#5555FF'>*</font>r <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>s <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>1</font>; |
|
|
|
|
|
<font color='#009900'>// calculate the new number for digits_used |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>r <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>-</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>else</font> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
result<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> data<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<b>}</b> |
|
|
|
|
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>bool</u></font> bigint_kernel_1:: |
|
<b><a name='is_less_than'></a>is_less_than</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> lhs, |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> rhs |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
uint32 lhs_digits_used <font color='#5555FF'>=</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
uint32 rhs_digits_used <font color='#5555FF'>=</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
|
|
<font color='#009900'>// if lhs is definitely less than rhs |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>lhs_digits_used <font color='#5555FF'><</font> rhs_digits_used <font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> <font color='#979000'>true</font>; |
|
<font color='#009900'>// if lhs is definitely greater than rhs |
|
</font> <font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>lhs_digits_used <font color='#5555FF'>></font> rhs_digits_used<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> <font color='#979000'>false</font>; |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
uint16<font color='#5555FF'>*</font> l <font color='#5555FF'>=</font> end <font color='#5555FF'>+</font> lhs_digits_used; |
|
uint16<font color='#5555FF'>*</font> r <font color='#5555FF'>=</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number <font color='#5555FF'>+</font> rhs_digits_used; |
|
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>l <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>-</font><font color='#5555FF'>-</font>l; |
|
<font color='#5555FF'>-</font><font color='#5555FF'>-</font>r; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>l <font color='#5555FF'><</font> <font color='#5555FF'>*</font>r<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> <font color='#979000'>true</font>; |
|
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>l <font color='#5555FF'>></font> <font color='#5555FF'>*</font>r<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> <font color='#979000'>false</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// at this point we know that they are equal |
|
</font> <font color='#0000FF'>return</font> <font color='#979000'>false</font>; |
|
<b>}</b> |
|
|
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>bool</u></font> bigint_kernel_1:: |
|
<b><a name='is_equal_to'></a>is_equal_to</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> lhs, |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> rhs |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
<font color='#009900'>// if lhs and rhs are definitely not equal |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>!</font><font color='#5555FF'>=</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font color='#979000'>false</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
uint16<font color='#5555FF'>*</font> l <font color='#5555FF'>=</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
uint16<font color='#5555FF'>*</font> r <font color='#5555FF'>=</font> rhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> l <font color='#5555FF'>+</font> lhs<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
|
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>l <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>l <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#5555FF'>*</font>r<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> <font color='#979000'>false</font>; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>l; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>r; |
|
<b>}</b> |
|
|
|
<font color='#009900'>// at this point we know that they are equal |
|
</font> <font color='#0000FF'>return</font> <font color='#979000'>true</font>; |
|
<b>}</b> |
|
|
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='increment'></a>increment</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> source, |
|
data_record<font color='#5555FF'>*</font> dest |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
uint16<font color='#5555FF'>*</font> s <font color='#5555FF'>=</font> source<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
uint16<font color='#5555FF'>*</font> d <font color='#5555FF'>=</font> dest<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> s <font color='#5555FF'>+</font> source<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>true</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>*</font>d <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>s <font color='#5555FF'>+</font> <font color='#979000'>1</font>; |
|
|
|
<font color='#009900'>// if there was no carry then break out of the loop |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>d <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
dest<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> source<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
|
|
<font color='#009900'>// copy the rest of the digits over to d |
|
</font> <font color='#5555FF'>+</font><font color='#5555FF'>+</font>d; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>s; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>s <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>*</font>d <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>s; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>d; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>s; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
|
|
|
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>s; |
|
|
|
<font color='#009900'>// if we have hit the end of s and there was a carry up to this point |
|
</font> <font color='#009900'>// then just make the next digit 1 and add one to the digits used |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>s <font color='#5555FF'>=</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>d; |
|
dest<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> source<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>+</font> <font color='#979000'>1</font>; |
|
<font color='#5555FF'>*</font>d <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
|
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>d; |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<font color='#0000FF'><u>void</u></font> bigint_kernel_1:: |
|
<b><a name='decrement'></a>decrement</b> <font face='Lucida Console'>(</font> |
|
<font color='#0000FF'>const</font> data_record<font color='#5555FF'>*</font> source, |
|
data_record<font color='#5555FF'>*</font> dest |
|
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font> |
|
<b>{</b> |
|
uint16<font color='#5555FF'>*</font> s <font color='#5555FF'>=</font> source<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
uint16<font color='#5555FF'>*</font> d <font color='#5555FF'>=</font> dest<font color='#5555FF'>-</font><font color='#5555FF'>></font>number; |
|
uint16<font color='#5555FF'>*</font> end <font color='#5555FF'>=</font> s <font color='#5555FF'>+</font> source<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#979000'>true</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>*</font>d <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>s <font color='#5555FF'>-</font> <font color='#979000'>1</font>; |
|
|
|
<font color='#009900'>// if there was no carry then break out of the loop |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>d <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0xFFFF</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#009900'>// if we lost a digit in the subtraction |
|
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>d <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> s<font color='#5555FF'>+</font><font color='#979000'>1</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>source<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
dest<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>else</font> |
|
dest<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> source<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>-</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
dest<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used <font color='#5555FF'>=</font> source<font color='#5555FF'>-</font><font color='#5555FF'>></font>digits_used; |
|
<b>}</b> |
|
<font color='#0000FF'>break</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> |
|
<b>{</b> |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>d; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>s; |
|
<b>}</b> |
|
|
|
<b>}</b> |
|
|
|
<font color='#009900'>// copy the rest of the digits over to d |
|
</font> <font color='#5555FF'>+</font><font color='#5555FF'>+</font>d; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>s; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>s <font color='#5555FF'>!</font><font color='#5555FF'>=</font> end<font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#5555FF'>*</font>d <font color='#5555FF'>=</font> <font color='#5555FF'>*</font>s; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>d; |
|
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>s; |
|
<b>}</b> |
|
<b>}</b> |
|
|
|
<font color='#009900'>// ---------------------------------------------------------------------------------------- |
|
</font> |
|
<b>}</b> |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>// DLIB_BIGINT_KERNEL_1_CPp_ |
|
</font> |
|
|
|
</pre></body></html> |