Changeset 412bedd in git


Ignore:
Timestamp:
Jul 30, 2002, 5:25:26 PM (22 years ago)
Author:
Hans Schönemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
93a6da3eaf8fc40ffcff3a3aaf2362483b162046
Parents:
7af0e48f701a2fdb52f616fcd71856372b39e69f
Message:
*hannes: if there is no inverse ...


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

Legend:

Unmodified
Added
Removed
  • factory/fac_util.cc

    r7af0e48 r412bedd  
    11/* emacs edit mode for this file is -*- C++ -*- */
    2 /* $Id: fac_util.cc,v 1.8 1998-03-12 14:31:02 schmidt Exp $ */
     2/* $Id: fac_util.cc,v 1.9 2002-07-30 15:25:26 Singular Exp $ */
    33
    44#include <config.h>
     
    4646{
    4747    if ( this != &m ) {
    48         p = m.p;
    49         k = m.k;
    50         pk = m.pk;
    51         pkhalf = m.pkhalf;
     48        p = m.p;
     49        k = m.k;
     50        pk = m.pk;
     51        pkhalf = m.pkhalf;
    5252    }
    5353    return *this;
     
    5959    CanonicalForm u, r0 = this->operator()( f, false ), r1 = pk, q0 = 1, q1 = 0;
    6060    while ( ( r0 > 0 ) && ( r1 > 0 ) ) {
    61         u = r0 / r1;
    62         r0 = r0 % r1;
    63         q0 = u*q1 + q0;
    64         if ( r0 > 0 ) {
    65             u = r1 / r0;
    66             r1 = r1 % r0;
    67             q1 = u*q0 + q1;
    68         }
     61        u = r0 / r1;
     62        r0 = r0 % r1;
     63        q0 = u*q1 + q0;
     64        if ( r0 > 0 ) {
     65            u = r1 / r0;
     66            r1 = r1 % r0;
     67            q1 = u*q0 + q1;
     68        }
    6969    }
    7070    if ( r0 == 0 )
    71         return this->operator()( pk-q1, symmetric );
    72     else
    73         return this->operator()( q0, symmetric );
     71        return this->operator()( pk-q1, symmetric );
     72    else
     73        return this->operator()( q0, symmetric );
    7474}
    7575
     
    8080    PK = pk;
    8181    if ( symmetric )
    82         return mapdomain( f, mappksymmetric );
    83     else
    84         return mapdomain( f, mappk );
     82        return mapdomain( f, mappksymmetric );
     83    else
     84        return mapdomain( f, mappk );
    8585};
    8686
     
    8989{
    9090    if ( f.inCoeffDomain() )
    91         return c;
    92     else
    93         return f + ( c - LC( f ) ) * power( f.mvar(), degree( f ) );
     91        return c;
     92    else
     93        return f + ( c - LC( f ) ) * power( f.mvar(), degree( f ) );
    9494}
    9595
     
    9999    ASSERT( (f.inCoeffDomain() || f.isUnivariate()) && (g.inCoeffDomain() || g.isUnivariate()) && (f.inCoeffDomain() || g.inCoeffDomain() || f.mvar() == g.mvar()), "can not build remainder" );
    100100    if ( f.inCoeffDomain() )
    101         if ( g.inCoeffDomain() )
    102             return pk( f % g );
    103         else
    104             return pk( f );
     101        if ( g.inCoeffDomain() )
     102            return pk( f % g );
     103        else
     104            return pk( f );
    105105    else {
    106         Variable x = f.mvar();
    107         CanonicalForm invlcg = pk.inverse( g.lc() );
    108         CanonicalForm result = f;
    109         int degg = g.degree();
    110         while ( result.degree() >= degg ) {
    111             result = pk( result - lc( result ) * invlcg * g * power( x, result.degree() - degg ) );
    112         }
    113         return result;
     106        Variable x = f.mvar();
     107        CanonicalForm result = f;
     108        int degg = g.degree();
     109        CanonicalForm invlcg = pk.inverse( g.lc() );
     110        CanonicalForm gg = pk( g*invlcg );
     111        if((gg.lc().isOne()))
     112        {
     113          while ( result.degree() >= degg )
     114          {
     115            result -= pk(lc( result ) * gg) * power( x, result.degree() - degg );
     116            result=pk(result);
     117          }
     118        }
     119        else
     120        // no inverse found
     121        {
     122          CanonicalForm ic=icontent(g);
     123          if (!ic.isOne())
     124          {
     125            gg=g/ic;
     126            return remainder(f,gg,pk);
     127          }
     128          while ( result.degree() >= degg )
     129          {
     130            if (gg.lc().isZero()) return result;
     131            CanonicalForm lcgf = result.lc() / gg.lc();
     132            if (lcgf.inZ())
     133              gg = pk( g*lcgf );
     134            else
     135            {
     136              //printf("!\n\n");
     137              return result;
     138            }
     139            result -=  gg * power( x, result.degree() - degg );
     140            result=pk(result);
     141          }
     142        }
     143        return result;
    114144    }
    115145}
     
    120150    ASSERT( (f.inCoeffDomain() || f.isUnivariate()) && (g.inCoeffDomain() || g.isUnivariate()) && (f.inCoeffDomain() || g.inCoeffDomain() || f.mvar() == g.mvar()), "can not build remainder" );
    121151    if ( f.inCoeffDomain() )
    122         if ( g.inCoeffDomain() ) {
    123             divrem( f, g, quot, rem );
    124             quot = pk( quot );
    125             rem = pk( rem );
    126         }
    127         else {
    128             quot = 0;
    129             rem = pk( f );
    130         }
     152        if ( g.inCoeffDomain() ) {
     153            divrem( f, g, quot, rem );
     154            quot = pk( quot );
     155            rem = pk( rem );
     156        }
     157        else {
     158            quot = 0;
     159            rem = pk( f );
     160        }
    131161    else {
    132         Variable x = f.mvar();
    133         CanonicalForm invlcg = pk.inverse( g.lc() );
    134         rem = f;
    135         int degg = g.degree();
    136         while ( rem.degree() >= degg ) {
    137             quot += pk( lc( rem ) * invlcg ) * power( x, rem.degree() - degg );
    138             rem = pk( rem - lc( rem ) * invlcg * g * power( x, rem.degree() - degg ) );
    139         }
     162        Variable x = f.mvar();
     163        CanonicalForm invlcg = pk.inverse( g.lc() );
     164        rem = f;
     165        int degg = g.degree();
     166        while ( rem.degree() >= degg ) {
     167            quot += pk( lc( rem ) * invlcg ) * power( x, rem.degree() - degg );
     168            rem = pk( rem - lc( rem ) * invlcg * g * power( x, rem.degree() - degg ) );
     169        }
    140170    }
    141171}
     
    146176    CanonicalForm result = mod( f, PK );
    147177    if ( result > PKHALF )
    148         return result - PK;
    149     else
    150         return result;
     178        return result - PK;
     179    else
     180        return result;
    151181}
    152182
     
    166196    setCharacteristic( p );
    167197    {
    168         amodp = mapinto( a ); bmodp = mapinto( b );
    169         (void)extgcd( amodp, bmodp, smodp, tmodp );
     198        amodp = mapinto( a ); bmodp = mapinto( b );
     199        (void)extgcd( amodp, bmodp, smodp, tmodp );
    170200    }
    171201    setCharacteristic( 0 );
     
    173203
    174204    for ( j = 1; j < k; j++ ) {
    175         e = ( 1 - s * a - t * b ) / modulus;
    176         setCharacteristic( p );
    177         {
    178             e = mapinto( e );
    179             sigmat = smodp * e;
    180             taut = tmodp * e;
    181             divrem( sigmat, bmodp, q, sigma );
    182             tau = taut + q * amodp;
    183         }
    184         setCharacteristic( 0 );
    185         s += mapinto( sigma ) * modulus;
    186         t += mapinto( tau ) * modulus;
    187         modulus *= p;
     205        e = ( 1 - s * a - t * b ) / modulus;
     206        setCharacteristic( p );
     207        {
     208            e = mapinto( e );
     209            sigmat = smodp * e;
     210            taut = tmodp * e;
     211            divrem( sigmat, bmodp, q, sigma );
     212            tau = taut + q * amodp;
     213        }
     214        setCharacteristic( 0 );
     215        s += mapinto( sigma ) * modulus;
     216        t += mapinto( tau ) * modulus;
     217        modulus *= p;
    188218    }
    189219    S = s; T = t;
     
    197227    CanonicalForm s = 0;
    198228    for ( int i = f; i <= l; i++ )
    199         s += a[i];
     229        s += a[i];
    200230    return s;
    201231}
     
    208238    CanonicalForm p = 1;
    209239    for ( int i = f; i <= l; i++ )
    210         p *= a[i];
     240        p *= a[i];
    211241    return p;
    212242}
     
    233263    int n = a.max();
    234264    for ( ; fa <= n; fa++, fb++ )
    235         s += a[fa] * b[fb];
     265        s += a[fa] * b[fb];
    236266    return s;
    237267}
Note: See TracChangeset for help on using the changeset viewer.