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