<html><!-- Created using the cpp_pretty_printer from the dlib C++ library. See http://dlib.net for updates. --><head><title>dlib C++ Library - bigint_kernel_1.cpp</title></head><body bgcolor='white'><pre> <font color='#009900'>// Copyright (C) 2003 Davis E. King (davis@dlib.net) </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>