Changeset 1fc18b in git


Ignore:
Timestamp:
Aug 11, 2006, 11:47:22 AM (18 years ago)
Author:
Hans Schönemann <hannes@…>
Branches:
(u'spielwiese', '17f1d200f27c5bd38f5dfc6e8a0879242279d1d8')
Children:
cd3d3369e55f59ac72a629fa206a0f305d198a9e
Parents:
b667caf2ea37ddf1b9e31af26bf41fd6d4ccefd2
Message:
*hannes: better long invers


git-svn-id: file:///usr/local/Singular/svn/trunk@9401 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/modulop.cc

    rb667ca r1fc18b  
    22*  Computer Algebra System SINGULAR     *
    33****************************************/
    4 /* $Id: modulop.cc,v 1.5 2005-07-27 15:48:29 Singular Exp $ */
     4/* $Id: modulop.cc,v 1.6 2006-08-11 09:47:22 Singular Exp $ */
    55/*
    66* ABSTRACT: numbers modulo p (<=32003)
     
    102102
    103103#ifdef HAVE_DIV_MOD
    104 #if 1 //ifdef HAVE_NTL // in ntl.a
     104#ifdef USE_NTL_XGCD
     105//ifdef HAVE_NTL // in ntl.a
    105106//extern void XGCD(long& d, long& s, long& t, long a, long b);
    106107#include <NTL/ZZ.h>
     
    108109NTL_CLIENT
    109110#endif
     111#endif
     112
     113long InvMod(long a)
     114{
     115   long d, s, t;
     116
     117#ifdef USE_NTL_XGCD
     118   XGCD(d, s, t, a, npPrimeM);
     119   assume (d == 1);
    110120#else
    111 void XGCD(long& d, long& s, long& t, long a, long b)
    112 {
    113121   long  u, v, u0, v0, u1, v1, u2, v2, q, r;
    114122
    115    long aneg = 0, bneg = 0;
    116 
    117    if (a < 0) {
    118       a = -a;
    119       aneg = 1;
    120    }
    121 
    122    if (b < 0) {
    123       b = -b;
    124       bneg = 1;
    125    }
    126 
    127    u1=1; v1=0;
    128    u2=0; v2=1;
    129    u = a; v = b;
    130 
    131    while (v != 0) {
     123   assume(a>0);
     124   u1=1; u2=0;
     125   u = a; v = npPrimeM;
     126
     127   while (v != 0)
     128   {
    132129      q = u / v;
    133130      r = u % v;
     
    135132      v = r;
    136133      u0 = u2;
    137       v0 = v2;
    138       u2 =  u1 - q*u2;
    139       v2 = v1- q*v2;
     134      u2 = u1 - q*u2;
    140135      u1 = u0;
    141       v1 = v0;
    142136   }
    143137
    144    if (aneg)
    145       u1 = -u1;
    146 
    147    if (bneg)
    148       v1 = -v1;
    149 
    150    d = u;
     138   assume(u==1);
    151139   s = u1;
    152    t = v1;
    153 }
    154 #endif
    155 
    156 long InvMod(long a)
    157 {
    158    long d, s, t;
    159 
    160    XGCD(d, s, t, a, npPrimeM);
    161    assume (d == 1);
     140#endif
    162141   if (s < 0)
    163142      return s + npPrimeM;
Note: See TracChangeset for help on using the changeset viewer.