00001 #include <symbolism/N.h> 00002 00003 namespace symbolism { 00004 namespace ring { 00005 00006 void N::add_one_large() 00007 { 00008 limb_t carry = 1; 00009 for(size_t i=0; i <= size && carry; i++) 00010 { 00011 limb_t old = data[i]; 00012 data[i] += carry; 00013 carry = (limb < old) ? 1 : 0; 00014 } 00015 add_carry_large(carry); 00016 } 00017 00018 void N::add_large_small(const N& a, const limb_t b) 00019 { 00020 reserve(a.size); 00021 N::limb_t carry = mpn_add_1(data, a.data, a.size + 1, b); 00022 add_carry_large(carry); 00023 } 00024 00025 void N::add_large_large(const N& a, const N& b) 00026 { 00027 reserve(max(a.size, b.size)); 00028 N::limb_t carry; 00029 if(a.size > b.size) 00030 { 00031 carry = mpn_add(data, a.data, a.size + 1, b.data, b.size + 1); 00032 } 00033 else if(a.size == b.size) 00034 { 00035 carry = mpn_add_n(data, a.data, b.data, a.size + 1); 00036 } 00037 else 00038 { 00039 carry = mpn_add(data, b.data, b.size + 1, a.data, a.size + 1); 00040 } 00041 add_carry_large(carry); 00042 } 00043 00044 void N::add_large_small(const limb_t a) 00045 { 00046 limb_t carry; 00047 carry = mpn_add_1(data, data, size + 1, a); 00048 add_carry_large(carry); 00049 } 00050 00051 void N::add_small_large(const N& a) 00052 { 00053 limb_t old = limb; 00054 limb_t carry; 00055 reserve(a.size); 00056 carry = mpn_add_1(data, a.data, a.size + 1, old); 00057 add_carry_large(carry); 00058 } 00059 00060 void N::add_large_large(const N& a) 00061 { 00062 if(size < a.size) 00063 { 00064 resize(a.size); 00065 } 00066 if(size == a.size) 00067 { 00068 limb_t carry = mpn_add_n(data, data, a.data, size + 1); 00069 add_carry_large(carry); 00070 } 00071 else 00072 { 00073 limb_t carry = mpn_add(data, data, size + 1, a.data, a.size + 1); 00074 add_carry_large(carry); 00075 } 00076 } 00077 00078 }}
Copyright © 2007-2008 Remco Bloemen.
Generated on Tue Jan 22 17:35:31 2008 for symbolism by doxygen 1.5.4