src/N.Addition.cpp

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

Hosted by SourceForge.net Logo