src/N.Substraction.cpp

00001 #include <symbolism/N.h>
00002 #include <string>
00003 #include <sstream>
00004 
00005 using namespace std;
00006 
00007 namespace symbolism {
00008 namespace ring {
00009 
00010 void N::sub_large_large(const N& a, const N& b)
00011 {
00012     limb_t borrow;
00013     reserve(max(a.size, b.size));
00014     if(a.size > b.size)
00015     {
00016         borrow = mpn_sub(data, a.data, a.size + 1, b.data, b.size + 1);
00017     }
00018     else if(a.size == b.size)
00019     {
00020         borrow = mpn_sub_n(data, a.data, b.data, a.size + 1);
00021     }
00022     else
00023     {
00024         borrow = mpn_sub(data, b.data, b.size + 1, a.data, a.size + 1);
00025     }
00026     if(borrow)
00027     {
00028         throw result_negative_exception(__FILE__, __LINE__);
00029     }
00030     normalize();
00031 }
00032 
00033 void N::sub_large_large(const N& a)
00034 {
00035     N::limb_t borrow;
00036     if(size > a.size)
00037     {
00038         borrow = mpn_sub(data, data, size + 1, a.data, a.size + 1);
00039     }
00040     else if(size == a.size)
00041     {
00042         borrow = mpn_sub_n(data, data, a.data, size + 1);
00043     }
00044     else
00045     {
00046         throw result_negative_exception(__FILE__, __LINE__);
00047     }
00048     if(borrow)
00049     {
00050         throw result_negative_exception(__FILE__, __LINE__);
00051     }
00052     normalize();
00053 }
00054 
00055 void N::sub_large_small(const N& a, const N::limb_t b)
00056 {
00057     N::limb_t borrow;
00058     reserve(a.size);
00059     borrow = mpn_sub_1(data, a.data, a.size + 1, b);
00060     if(borrow)
00061     {
00062         throw result_negative_exception(__FILE__, __LINE__);
00063     }
00064     normalize();
00065 }
00066 
00067 void N::sub_large_small(const N::limb_t a)
00068 {
00069     N::limb_t borrow;
00070     borrow = mpn_sub_1(data, data, size + 1, a);
00071     if(borrow)
00072     {
00073         throw result_negative_exception(__FILE__, __LINE__);
00074     }
00075     normalize(); // Chance of unormalization is small
00076 }
00077 
00078 void N::sub_one_large()
00079 {
00080     limb_t borrow = 1;
00081     for(size_t i=0; i <= size && borrow; i++)
00082     {
00083         limb_t old = data[i];
00084         data[i] -= borrow;
00085         borrow = (limb > old) ? 1 : 0;
00086     }
00087     if(borrow)
00088     {
00089         throw result_negative_exception(__FILE__, __LINE__);
00090     }
00091 }
00092 
00093 }}

Copyright © 2007-2008 Remco Bloemen.

Generated on Tue Jan 22 17:35:31 2008 for symbolism by doxygen 1.5.4

Hosted by SourceForge.net Logo