免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14774 | 回复: 5
打印 上一主题 下一主题

一个十进制大数运算类,支持加减乘除模、n次乘方、n次开方等运算 [复制链接]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-18 13:08 |显示全部楼层 |倒序浏览
花了点时间写了这么个东西,目前只支持正整数的运算。
还有很多重要的功能,如素性的检测等还没有完成。
增加了负数 --20060823

decnum.h
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <iostream>

  4. using namespace std;

  5. class decnum
  6. {
  7.     friend decnum pow(const decnum& x, int n);
  8.     friend decnum root(const decnum& x, int n);
  9.     friend decnum div(const decnum& x, const decnum& y, decnum& r);
  10.     friend decnum abs(const decnum& x);
  11.     friend bool operator==(const decnum& x, const decnum&y);
  12.     friend bool operator!=(const decnum& x, const decnum&y);
  13.     friend bool operator>(const decnum& x, const decnum&y);
  14.     friend bool operator<(const decnum& x, const decnum&y);
  15.     friend bool operator>=(const decnum& x, const decnum&y);
  16.     friend bool operator<=(const decnum& x, const decnum&y);
  17.     friend ostream& operator<<(ostream&os, const decnum& x);

  18. public:
  19.     decnum() : cap(0), num(0), sign(0), val(NULL) { }
  20.     decnum(const char *v, int n)
  21.     {
  22.         int i, j;
  23.         val = new char[n];
  24.         if(v[0] == '-') {
  25.             sign = 1;
  26.             v++;
  27.             n--;
  28.         }
  29.         else {
  30.             sign = 0;
  31.             if(v[0] == '+')
  32.                 v++;
  33.         }
  34.         for(i = 0; i < n && v[i] == '0'; i++);
  35.         for(j=0; i<n; i++, j++)
  36.             if(v[n-1-i] >= '0' && v[n-1-i] <= '9')
  37.                 val[j] = v[n-1-i] - '0';
  38.             else
  39.                 break;
  40.         num = j;
  41.         cap = n;
  42.     }
  43.     decnum(const decnum& x)
  44.     {
  45.         val = new char[x.num];
  46.         memcpy(val, x.val, x.num);
  47.         sign = x.sign;
  48.         num = x.num;
  49.         cap = x.num;
  50.     }
  51.     decnum(int x)
  52.     {
  53.         if(x==0) {
  54.             cap = num = 0;
  55.             val = NULL;
  56.             return;
  57.         }
  58.         if(x < 0) {
  59.             sign = 1;
  60.             x = -x;
  61.         }
  62.         else
  63.             sign = 0;
  64.         char temp[20];
  65.         sprintf(temp, "%d", x);
  66.         int n = strlen(temp);
  67.         num = cap = n;
  68.         val = new char[n];
  69.         for(int i=0; i<n; i++)
  70.             val[i] = temp[n-1-i] - '0';
  71.     }
  72.     decnum(long long x)
  73.     {
  74.         if(x==0) {
  75.             cap = num = 0;
  76.             val = NULL;
  77.             return;
  78.         }
  79.         if(x < 0) {
  80.             sign = 1;
  81.             x = -x;
  82.         }
  83.         else
  84.             sign = 0;
  85.         char temp[20];
  86.         sprintf(temp, "%lld", x);
  87.         int n = strlen(temp);
  88.         num = cap = n;
  89.         val = new char[n];
  90.         for(int i=0; i<n; i++)
  91.             val[i] = temp[n-1-i] - '0';
  92.     }
  93.     ~decnum() { delete[] val; }

  94.     int size() const { return num; }

  95.     decnum&
  96.     operator=(const decnum& x)
  97.     {
  98.         if (this != &x) {
  99.             if(cap < x.num) {
  100.                 delete[] val;
  101.                 val = new char[x.num];
  102.                 cap = x.num;
  103.             }
  104.             memcpy(val, x.val, x.num);
  105.             num = x.num;
  106.             sign = x.sign;
  107.         }
  108.         return *this;
  109.     }
  110.     decnum&
  111.     operator=(int x)
  112.     {
  113.         *this = decnum(x);
  114.         return *this;
  115.     }
  116.     decnum&
  117.     operator=(long long x)
  118.     {
  119.         *this = decnum(x);
  120.         return *this;
  121.     }

  122.     decnum& abs()
  123.     {
  124.         sign = 0;
  125.         return *this;
  126.     }
  127.     decnum& operator+=(const decnum& x);
  128.     decnum& operator-=(const decnum& x);
  129.     decnum& operator*=(const decnum& x);
  130.     decnum& operator/=(const decnum& x);
  131.     decnum& operator%=(const decnum& x);
  132.     decnum  operator+(const decnum& x) const;
  133.     decnum  operator-(const decnum& x) const;
  134.     decnum  operator*(const decnum& x) const;
  135.     decnum  operator/(const decnum& x) const;
  136.     decnum  operator%(const decnum& x) const;

  137.     bool ispow(int n, decnum& r) const;
  138.     bool ispow() const;
  139. private:
  140.     int  cap;
  141.     int  num;
  142.     int  sign;
  143.     char *val;
  144. private:
  145.     char root_1(int n);
  146.     decnum& absadd(const decnum& x);
  147.     decnum& abssub(const decnum& x);
  148.     bool absge(const decnum& x);
  149. };

复制代码


decnum.cpp

  1. #include "decnum.h"

  2. decnum&
  3. decnum::absadd(const decnum& x)
  4. {
  5.     int i, max;
  6.     char carry = 0, ch;

  7.     if(x.num == 0) return *this;
  8.     if(num < x.num)
  9.         max = x.num + 1;
  10.     else
  11.         max = num + 1;
  12.     if(max > cap)
  13.     {
  14.         cap = max;
  15.         char *newval = new char[cap];
  16.         memcpy(newval, val, num);
  17.         memset(newval+num, 0, cap - num);
  18.         delete[] val;
  19.         val = newval;
  20.     }
  21.     else
  22.     {
  23.         memset(val+num, 0, max - num);
  24.     }
  25.     num = max-1;
  26.     for(i=0; i<x.num; i++) {
  27.         ch = val[i] + x.val[i] + carry;
  28.         if(ch > 9) {
  29.             carry = 1;
  30.             val[i] = ch - 10;
  31.         }
  32.         else {
  33.             carry = 0;
  34.             val[i] = ch;
  35.         }
  36.     }
  37.     for(; i<=num && carry == 1; i++) {
  38.         ch = val[i] + 1;
  39.         if(ch > 9) {
  40.             carry = 1;
  41.             val[i] = ch - 10;
  42.         }
  43.         else {
  44.             carry = 0;
  45.             val[i] = ch;
  46.         }
  47.     }
  48.     if(i>num) num = i;
  49.     return *this;
  50. }

  51. decnum&
  52. decnum::abssub(const decnum& x)
  53. {
  54.     if(x.num == 0) return *this;
  55.     int i;
  56.     char carry = 0, ch;
  57.     for(i=0; i<x.num; i++) {
  58.         ch = val[i] - x.val[i] - carry;
  59.         if(ch < 0) {
  60.             carry = 1;
  61.             val[i] = ch + 10;
  62.         }
  63.         else {
  64.             carry = 0;
  65.             val[i] = ch;
  66.         }
  67.     }
  68.     for(; i<num && carry == 1; i++) {
  69.         ch = val[i] - 1;
  70.         if(ch < 0) {
  71.             carry = 1;
  72.             val[i] = ch + 10;
  73.         }
  74.         else {
  75.             carry = 0;
  76.             val[i] = ch;
  77.         }
  78.     }
  79.     for(i=num; i>0 && val[i-1] == 0; i--);
  80.     num = i;
  81.     return *this;
  82. }

  83. bool
  84. decnum::absge(const decnum& x)
  85. {
  86.     if(num > x.num) return true;
  87.     if(num < x.num) return false;
  88.     for(int i=num-1; i >= 0; i--)
  89.         if(val[i] > x.val[i])
  90.             return true;
  91.         else if(val[i] < x.val[i])
  92.             return false;
  93.     return true;
  94. }

  95. decnum&
  96. decnum::operator+=(const decnum& x)
  97. {
  98.     if(x.sign == sign)
  99.         return absadd(x);
  100.     else if(absge(x))
  101.         return abssub(x);
  102.     else {
  103.         decnum tmp(*this);
  104.         *this = x;
  105.         return abssub(tmp);
  106.     }
  107. }

  108. decnum&
  109. decnum::operator-=(const decnum& x)
  110. {
  111.     if(x.sign != sign)
  112.         return absadd(x);
  113.     else if(absge(x))
  114.         return abssub(x);
  115.     else {
  116.         decnum tmp(*this);
  117.         *this = x;
  118.         return abssub(tmp);
  119.     }
  120. }

  121. decnum&
  122. decnum::operator*=(const decnum& x)
  123. {
  124.     if(num == 0) return *this;
  125.     if(x.num == 0) {
  126.         num = 0;
  127.         return *this;
  128.     }
  129.     if(sign == x.sign)
  130.         sign = 0;
  131.     else
  132.         sign = 1;
  133.     int mul, i, n, newcap, max;
  134.     char ch, carry;
  135.     char *newval = new char[num + x.num];
  136.     newcap = num + x.num;
  137.     memset(newval, 0, num + x.num);

  138.     decnum a, b;
  139.     char *ptr;
  140.     for(i=0; i<num && val[i] == 0; i++);
  141.     int na = i;
  142.     a.val = val + i;
  143.     a.num = num - i;
  144.     for(i=0; i<num && x.val[i] == 0; i++);
  145.     int nb = i;
  146.     b.val = x.val + i;
  147.     b.num = x.num - i;
  148.     ptr = newval + na + nb;

  149.     for(n=0; n <= a.num + b.num - 2; n++) {
  150.         mul = 0;
  151.         if(n > b.num - 1)
  152.             i = n - b.num + 1;
  153.         else
  154.             i=0;
  155.         max = n < a.num-1 ? n : a.num-1;
  156.         for(; i<=max; i++)
  157.             mul += a.val[i]*b.val[n-i];
  158.         carry = 0;
  159.         for(i=n; mul > 0 || carry > 0; mul /= 10, i++) {
  160.             ch = ptr[i] + mul % 10 + carry;
  161.             if(ch > 9) {
  162.                 carry = 1;
  163.                 ptr[i] = ch - 10;
  164.             }
  165.             else
  166.             {
  167.                 carry = 0;
  168.                 ptr[i] = ch;
  169.             }
  170.         }
  171.     }
  172.     for(i=a.num + b.num; i>0 && ptr[i-1] == 0; i--);
  173.     num = i + na + nb;
  174.     if(cap >= num) {
  175.         memcpy(val, newval, num);
  176.         delete[] newval;
  177.     }
  178.     else {
  179.         cap = newcap;
  180.         delete[] val;
  181.         val = newval;
  182.     }
  183.     a.val = b.val = NULL;
  184.     return *this;
  185. }

  186. decnum&
  187. decnum::operator/=(const decnum& x)
  188. {
  189.     char ch, carry, fac;
  190.     decnum tmp;
  191.     int i;
  192.     if(x.num == 0) return *this;
  193.     if(num < x.num) {
  194.         num = 0;
  195.         return *this;
  196.     }
  197.     if(sign == x.sign)
  198.         sign = 0;
  199.     else
  200.         sign = 1;
  201.     char *newval = new char[num - x.num + 1];
  202.     memset(newval, 0, num - x.num + 1);
  203.     carry = 0;
  204.     fac = x.val[x.num-1] + 1;
  205.     tmp.val = val + num - x.num + 1;
  206.     tmp.cap = tmp.num = x.num -1;
  207.     for(i=num-1; i>= x.num-1; i--) {
  208.         tmp.val--;
  209.         tmp.num++;
  210.         ch = (carry * 10 + val[i]) / fac;
  211.         tmp  -= x * ch;
  212.         while(tmp >= x) {
  213.             tmp -= x;
  214.             ch++;
  215.         }
  216.         newval[i-x.num+1] = ch;
  217.         carry = val[i];
  218.     }
  219.     tmp.val = NULL;
  220.     for(i=num-x.num+1; i>0 && newval[i-1] == 0; i--);
  221.     num = i;
  222.     delete[] val;
  223.     val = newval;
  224.     return *this;
  225. }

  226. decnum&
  227. decnum::operator%=(const decnum& x)
  228. {
  229.     char ch, carry, fac;
  230.     decnum tmp;
  231.     int i;
  232.     if(x.num == 0) return *this;
  233.     if(num < x.num) return *this;

  234.     carry = 0;
  235.     fac = x.val[x.num-1] + 1;
  236.     tmp.val = val + num - x.num + 1;
  237.     tmp.num = x.num - 1;
  238.     for(i=num-1; i>= x.num-1; i--) {
  239.         tmp.val--;
  240.         tmp.num++;
  241.         ch = (carry * 10 + val[i]) / fac;
  242.         tmp  -= x * ch;
  243.         while(tmp >= x) {
  244.             tmp -= x;
  245.             ch++;
  246.         }
  247.         carry = val[i];
  248.     }
  249.     tmp.val = NULL;
  250.     num = tmp.num;
  251.     return *this;
  252. }

  253. decnum
  254. decnum::operator+(const decnum& x) const
  255. {
  256.     decnum tmp = *this;
  257.     return tmp += x;
  258. }

  259. decnum
  260. decnum::operator-(const decnum& x) const
  261. {
  262.     decnum tmp = *this;
  263.     return tmp -= x;
  264. }

  265. decnum
  266. decnum::operator*(const decnum& x) const
  267. {
  268.     decnum tmp = *this;
  269.     return tmp *= x;
  270. }

  271. decnum
  272. decnum::operator/(const decnum& x) const
  273. {
  274.     decnum tmp = *this;
  275.     return tmp /= x;
  276. }

  277. decnum
  278. decnum::operator%(const decnum& x) const
  279. {
  280.     decnum tmp = *this;
  281.     return tmp %= x;
  282. }

  283. decnum abs(const decnum& x)
  284. {
  285.     decnum tmp(x);
  286.     tmp.sign = 0;
  287.     return tmp;
  288. }

  289. decnum pow(const decnum& x, int n)
  290. {
  291.     decnum tmp(1), fac(x);
  292.     for(; n>0; n>>=1) {
  293.         if(n&0x01)
  294.             tmp *= fac;
  295.         fac *= fac;
  296.     }
  297.     return tmp;
  298. }

  299. char decnum::root_1(int n)
  300. {
  301.     char r = (int)(pow(1+val[num-1], 1.0/n) * pow(10,(num-1.0)/n));
  302.     for(; r>0 && pow(decnum(r), n) > *this; r--);
  303.     return r;
  304. }

  305. bool decnum::ispow(int n, decnum& r) const
  306. {
  307.     if(num == 0) {
  308.         r.num = 0;
  309.         return true;
  310.     }
  311.     if(sign == 1 && (n&1 == 0)) {
  312.         r.num = 0;
  313.         return false;
  314.     }
  315.     decnum tmp, p;
  316.     r.cap = r.num = (num+n-1) / n;
  317.     r.val = new char[r.num];
  318.     r.sign = sign;
  319.     memset(r.val, 0, r.num);
  320.     tmp.val = val + (r.num-1)*n;
  321.     tmp.num = num - (r.num-1)*n;
  322.     r.val[r.num-1] = tmp.root_1(n);

  323.     tmp.val = new char[r.num+1];
  324.     tmp.cap = r.num+1;
  325.     int v;
  326.     p = pow(r, n);
  327.     if(p == *this) return true;
  328.     for(int i=r.num-2; i>=0; i--) {
  329.         memset(tmp.val, 0, i+1);
  330.         tmp.val[i] = 1;
  331.         tmp.num = i+1;
  332.         tmp += r;
  333.         p = (*this - p) / (pow(tmp, n) - p);
  334.         if(p.num > 1)
  335.             v = 9;
  336.         else if(p.num > 0)
  337.             v = p.val[0];
  338.         else
  339.             v = 0;
  340.         for(; v>=0; v--) {
  341.             r.val[i] = v;
  342.             p = pow(r, n);
  343.             if(p == *this)
  344.                 return true;
  345.             if(p < *this)
  346.                 break;
  347.         }
  348.     }
  349.     return false;
  350. }

  351. bool decnum::ispow() const
  352. {
  353.     decnum r, dec2("2", 1);
  354.     if(ispow(2, r)) return true;
  355.     for(int n=3; r > dec2; n+=2) {
  356.         if(ispow(n, r)) return true;
  357.     }
  358.     return false;
  359. }

  360. decnum
  361. root(const decnum& x, int n)
  362. {
  363.     decnum r;
  364.     x.ispow(n, r);
  365.     return r;
  366. }

  367. decnum
  368. div(const decnum& x, const decnum& y, decnum& r)
  369. {
  370.     char ch, carry, fac;
  371.     decnum d = x, tmp;
  372.     int i;
  373.     if(y.num == 0) return x;
  374.     if(d.num < y.num) {
  375.         r = x;
  376.         d = 0;
  377.         return d;
  378.     }
  379.     char *newval = new char[d.num - y.num + 1];
  380.     memset(newval, 0, d.num - y.num + 1);
  381.     carry = 0;
  382.     fac = y.val[y.num-1] + 1;
  383.     tmp.val = d.val + d.num - y.num + 1;
  384.     tmp.num = y.num - 1;
  385.     for(i=d.num-1; i>= y.num-1; i--) {
  386.         tmp.val--;
  387.         tmp.num++;
  388.         ch = (carry * 10 + d.val[i]) / fac;
  389.         tmp  -= y * ch;
  390.         while(tmp >= y) {
  391.             tmp -= y;
  392.             ch++;
  393.         }
  394.         newval[i-y.num+1] = ch;
  395.         carry = d.val[i];
  396.     }
  397.     r = tmp;
  398.     tmp.val = NULL;
  399.     for(i=d.num-y.num+1; i>0 && newval[i-1] == 0; i--);
  400.     d.num = i;
  401.     delete[] d.val;
  402.     d.val = newval;
  403.     return d;
  404. }

  405. bool operator==(const decnum& x, const decnum&y)
  406. {
  407.     if(x.sign != y.sign) return false;
  408.     if(x.num != y.num) return false;
  409.     for(int i=0; i < x.num; i++)
  410.         if(x.val[i] != y.val[i])
  411.             return false;
  412.     return true;
  413. }

  414. bool operator!=(const decnum& x, const decnum&y)
  415. {
  416.     return !(x==y);
  417. }

  418. bool operator>(const decnum& x, const decnum&y)
  419. {
  420.     if(x.sign > y.sign) return false;
  421.     if(x.sign < y.sign) return true;
  422.     bool retval = (x.sign == 0);
  423.     if(x.num > y.num) return retval;
  424.     if(x.num < y.num) return !retval;
  425.     for(int i=x.num-1; i >= 0; i--)
  426.         if(x.val[i] > y.val[i])
  427.             return retval;
  428.         else if(x.val[i] < y.val[i])
  429.             return !retval;
  430.     return false;
  431. }

  432. bool operator<(const decnum& x, const decnum&y)
  433. {
  434.     return y > x;
  435. }

  436. bool operator>=(const decnum& x, const decnum&y)
  437. {
  438.     if(x.sign > y.sign) return false;
  439.     if(x.sign < y.sign) return true;
  440.     bool retval = (x.sign == 0);
  441.     if(x.num > y.num) return retval;
  442.     if(x.num < y.num) return !retval;
  443.     for(int i=x.num-1; i >= 0; i--)
  444.         if(x.val[i] > y.val[i])
  445.             return retval;
  446.         else if(x.val[i] < y.val[i])
  447.             return !retval;
  448.     return true;
  449. }

  450. bool operator<=(const decnum& x, const decnum&y)
  451. {
  452.     return y >= x;
  453. }

  454. ostream& operator<<(ostream&os, const decnum& x)
  455. {
  456.     if(x.size() == 0)
  457.         os << 0;
  458.     else {
  459.         if(x.sign == 1)
  460.             os << "-";
  461.         for(int i = x.size()-1; i>=0; i--)
  462.             os << (int)x.val[i];
  463.     }
  464.     return os;
  465. }

复制代码

[ 本帖最后由 yuxh 于 2006-8-23 18:11 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-08-18 13:26 |显示全部楼层
这个本来是为大素数的测试用的,这些是要用到的基本运算
可惜我的工作与加密算法无关,纯粹是业余爱好,代码也是业余水平的。
就效率而言,比较慢的就是求n次方根这个了:
root(x, n)
设x有m位,则算法应该是O(m^3*log(m)/n)的
检测一个数是否是某个数的整数次幂:
ispow()
这个就差不多是O(m^3*log(m)^2)的了

[ 本帖最后由 yuxh 于 2006-8-22 11:17 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2006-08-22 12:30 |显示全部楼层
我写这个类的目的是想实现判断一个数是否是素数, 其中第一步就是判断这个数是否某个数的整数次幂
所以我关心的是运算的效率,而不是把它扩展成浮点数形式等更适用的情况
由于在推导一些公式时就是用10进制来考虑的,所以写的代码里也是用10进制数表示的,其实,对代码作一些相应的改动,是很方便换成16进制或别的基进制,(也可以扩展成浮点数的形式,但对我的应用来说,意义不大).

[ 本帖最后由 yuxh 于 2006-8-22 12:38 编辑 ]

dec.JPG (48.31 KB, 下载次数: 57)

基本运算的说明

基本运算的说明

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-08-22 13:04 |显示全部楼层
贴一段测试代码给大家玩玩
  1. #include "decnum.h"

  2. int main()
  3. {
  4.     decnum x, y, r;
  5.     char *line = NULL;
  6.     size_t  n = 0;
  7.     int read;

  8.     cout << "input x:" << endl;
  9.     if((read = (int)getline(&line, &n, stdin)) != -1) {
  10.         x = decnum(line, read-1);
  11.     }
  12.     else
  13.         exit(-1);

  14.     cout << "input y:" << endl;
  15.     if((read = (int)getline(&line, &n, stdin)) != -1) {
  16.         y = decnum(line, read-1);
  17.     }
  18.     else
  19.         exit(-1);

  20.     cout << "x = " << x << endl;
  21.     cout << "y = " << y << endl;
  22.     cout << "x * y =" << x * y << endl;
  23.     cout << "x / y =" << x / y << endl;
  24.     cout << "x % y =" << x % y << endl;
  25.     cout << "div(x, y) =" << div(x , y, r) << endl;
  26.     cout << "mod(x, y) =" << r << endl;
  27.     cout << "y ^ 2 =" << pow(y, 2) << endl;
  28.     cout << "x ^ 1/2 =" << root(x, 2) << endl;
  29.     cout << "x is pow = " << x.ispow() << endl;

  30.     return 0;
  31. }
复制代码

input x:
12934891238741902347120934871230948712390487123904871239047812390847123094871230948712309487123904871230947123980471203948712309487120394712398471239048713256129834712903847120394781239084712930487231094712394087123094123481203333333333333333333333333333333333333333333888888888888888888888888888888888888888888888888222222222222222222222222222222222222221094387123908471293048721903487123908412903471290384712398471239847213984712938471209384172093847129834712093847123904123471290384712398471209348712093847120938471297340129341
input y:
87123904781239084712309487123094871230948712390487123
x = 12934891238741902347120934871230948712390487123904871239047812390847123094871230948712309487123904871230947123980471203948712309487120394712398471239048713256129834712903847120394781239084712930487231094712394087123094123481203333333333333333333333333333333333333333333888888888888888888888888888888888888888888888888222222222222222222222222222222222222221094387123908471293048721903487123908412903471290384712398471239847213984712938471209384172093847129834712093847123904123471290384712398471209348712093847120938471297340129341
y = 87123904781239084712309487123094871230948712390487123
x * y =1126938232639833173075933852454844491172426928514059866807740841770815249456423275828974308682129087476539239375374114934208988211619943619716558347499808789403504191997992053251495407207133672212198009872845450749525122406765537233683189166639249361344448037097903846536903047332910602617949715068386039572749284661323652396812507276858460341917936752512602597008627491342253724797935606421392773895578442187710885039658694980497445673861077574294718176507864939038642062979105391800654254681231524754223749316701123751673470225808955075291647887679573776980478625133783450814975943
x / y =148465467327484275048232812439334306695533671227089122007816650126394502951501427671718661140385906942393209068225081817296775831986299773922335101921640962699307587052445014486841122328740344708845214812651256032481988250472736002705523700302442398432754627409724200156670159012028113430398315975429449502269548763370786332836604219524721316400456079938591537603272259855595623013801608933716962712146970686555106278637839124034044858476557783789374654839217122223912234300207
x % y =79300951666803804539185154310166594060311523590394880
div(x, y) =148465467327484275048232812439334306695533671227089122007816650126394502951501427671718661140385906942393209068225081817296775831986299773922335101921640962699307587052445014486841122328740344708845214812651256032481988250472736002705523700302442398432754627409724200156670159012028113430398315975429449502269548763370786332836604219524721316400456079938591537603272259855595623013801608933716962712146970686555106278637839124034044858476557783789374654839217122223912234300207
mod(x, y) =79300951666803804539185154310166594060311523590394880
y ^ 2 =7590574784330414645380746230930586484532745231159928445672223588351361500455337820516206371351345228817129
x ^ 1/2 =3596510981318130543477927424759527967760623382196876121688918127992258229306117726707700713885454867164034990294666943466289844107281148419105171980209085534883218753821511324570335831894205011649807156193955342866243572062280023407886590191390520013437462254313721
x is pow = 0

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2006-08-22 13:12 |显示全部楼层
原帖由 思一克 于 2006-8-22 13:09 发表
yuxh 弄了一个伟大的工程呀


只是玩玩,呵呵~万里长征才走了第一步哇~

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-08-23 18:17 |显示全部楼层
增加了负数,但负数不支持取余(%)及相应的带余除法(div)
并用它解决了醉卧水云间 的pell方程的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP