source: git/factory/fac_sqrfree.cc @ d6b072c

spielwiese
Last change on this file since d6b072c was d6b072c, checked in by Rüdiger Stobbe <stobbe@…>, 28 years ago
"sqrFree: Now the product of all factors found by sqrFree is equal to the parameter of sqrFree. The bug resulted from an incorrect handling of the leading coefficient of the argument of sqrFree. " git-svn-id: file:///usr/local/Singular/svn/trunk@10 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 2.7 KB
Line 
1// emacs edit mode for this file is -*- C++ -*-
2// $Id: fac_sqrfree.cc,v 1.1 1996-05-20 13:39:48 stobbe Exp $
3
4#include "assert.h"
5#include "cf_defs.h"
6#include "canonicalform.h"
7
8/*
9$Log: not supported by cvs2svn $
10// Revision 1.0  1996/05/17  10:59:45  stobbe
11// Initial revision
12//
13*/
14
15static int divexp = 1;
16
17static void divexpfunc ( CanonicalForm &, int & e )
18{
19    e /= divexp;
20}
21
22CFFList sqrFreeFp ( const CanonicalForm & f )
23{
24    CanonicalForm t0 = f, t, v, w, h;
25    CanonicalForm leadcf = t0.lc();
26    Variable x = f.mvar();
27    CFFList F;
28    int p = getCharacteristic();
29    int k, e = 1;
30
31    if ( ! leadcf.isOne() )
32        t0 /= leadcf;
33
34    divexp = p;
35    while ( t0.degree(x) > 0 ) {
36        t = gcd( t0, t0.deriv() );
37        v = t0 / t;
38        k = 0;
39        while ( v.degree(x) > 0 ) {
40            k = k+1;
41            if ( k % p == 0 ) {
42                t /= v;
43                k = k+1;
44            }
45            w = gcd( t, v );
46            h = v / w;
47            v = w;
48            t /= v;
49            if ( h.degree(x) > 0 )
50                F.append( CFFactor( h/h.lc(), e*k ) );
51        }
52        t0 = apply( t, divexpfunc );
53        e = p * e;
54    }
55    if ( ! leadcf.isOne() ) {
56        if ( F.getFirst().exp() == 1 ) {
57            leadcf = F.getFirst().factor() * leadcf;
58            F.removeFirst();
59        }
60        F.insert( CFFactor( leadcf, 1 ) );
61    }
62    return F;
63}
64
65bool isSqrFreeFp( const CanonicalForm & f )
66{
67  CFFList F = sqrFreeFp( f );
68  return ( F.length() == 1 && F.getFirst().exp() == 1 );
69}
70
71int isSqrFreeZ ( const CanonicalForm & f )
72{
73    return gcd( f, f.deriv() ).degree() == 0;
74}
75
76/*
77
78CFFList sqrFreeZ ( const CanonicalForm & a )
79{
80    CanonicalForm b = a.deriv(), c = gcd( a, b );
81    CanonicalForm y, z, w = a / c;
82    int i = 1;
83    CFFList F;
84
85    while ( ! c.degree() == 0 ) {
86        y = gcd( w, c ); z = w / y;
87        if ( degree( z ) > 0 )
88            if ( lc( z ).sign() < 0 )
89                F.append( CFFactor( -z, i ) );
90            else
91                F.append( CFFactor( z, i ) );
92        i++;
93        w = y; c = c / y;
94    }
95    if ( degree( w ) > 0 )
96        if ( lc( w ).sign() < 0 )
97            F.append( CFFactor( -w, i ) );
98        else
99            F.append( CFFactor( w, i ) );
100    return F;
101}
102*/
103
104CFFList sqrFreeZ ( const CanonicalForm & a )
105{
106    if ( a.inCoeffDomain() )
107        return CFFactor( a, 1 );
108    CanonicalForm cont = content( a );
109    CanonicalForm aa = a / cont;
110    CanonicalForm b = aa.deriv(), c = gcd( aa, b );
111    CanonicalForm y, z, w = aa / c;
112    int i = 1;
113    CFFList F;
114    Variable v = aa.mvar();
115    while ( ! c.degree(v) == 0 ) {
116        y = gcd( w, c ); z = w / y;
117        if ( degree( z, v ) > 0 )
118            if ( lc( z ).sign() < 0 )
119                F.append( CFFactor( -z, i ) );
120            else
121                F.append( CFFactor( z, i ) );
122        i++;
123        w = y; c = c / y;
124    }
125    if ( degree( w,v ) > 0 )
126        if ( lc( w ).sign() < 0 )
127            F.append( CFFactor( -w, i ) );
128        else
129            F.append( CFFactor( w, i ) );
130    if ( ! cont.isOne() )
131        return Union( F, sqrFreeZ( cont ) );
132    else
133        return F;
134}
Note: See TracBrowser for help on using the repository browser.