Changeset 02af91 in git


Ignore:
Timestamp:
Jun 18, 1996, 8:57:00 AM (27 years ago)
Author:
Rüdiger Stobbe <stobbe@…>
Branches:
(u'spielwiese', '8e0ad00ce244dfd0756200662572aef8402f13d5')
Children:
cfa45ec3cccf336939c446d85de2dca6283593b1
Parents:
35930b6cf4435468b76d893cb0f2be0e692720cf
Message:
"Now the functionality to handle prime numbers that are bigger than 2^15.
This results in various changes and some new functions.
"


git-svn-id: file:///usr/local/Singular/svn/trunk@21 2c84dea3-7e68-4137-9b89-c4e89433aadc
Location:
factory
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • factory/ffops.cc

    r35930b r02af91  
    11// emacs edit mode for this file is -*- C++ -*-
    2 // $Id: ffops.cc,v 1.0 1996-05-17 10:59:46 stobbe Exp $
     2// $Id: ffops.cc,v 1.1 1996-06-18 06:57:00 stobbe Exp $
    33
    44/*
    55$Log: not supported by cvs2svn $
     6Revision 1.0  1996/05/17 10:59:46  stobbe
     7Initial revision
     8
    69*/
    710
     
    1215int ff_prime = 31991;
    1316int ff_halfprime = 31991 / 2;
     17bool ff_big = false;
    1418short * ff_invtab = new short [31991];
    1519
    1620void ff_setprime ( const int p )
    1721{
    18   ff_prime = p;
    19   ff_halfprime = ff_prime / 2;
    20   for ( int i = 0; i < ff_prime; i++ ) ff_invtab[i] = 0;
     22    ff_prime = p;
     23    ff_halfprime = ff_prime / 2;
     24    if ( ! ff_big )
     25        for ( int i = 0; i < ff_prime; i++ ) ff_invtab[i] = 0;
    2126}
    2227
    2328int ff_newinv ( const int a )
    2429{
    25   int u, r0 = a, r1 = ff_prime, q0 = 1, q1 = 0;
    26   while ( ( r0 > 0 ) && ( r1 > 0 ) ) {
    27     u = r0 / r1;
    28     r0 = r0 % r1;
    29     q0 = u*q1 + q0;
    30     if ( r0 > 0 ) {
    31       u = r1 / r0;
    32       r1 = r1 % r0;
    33       q1 = u*q0 + q1;
     30    int u, r0 = a, r1 = ff_prime, q0 = 1, q1 = 0;
     31    while ( ( r0 > 0 ) && ( r1 > 0 ) ) {
     32        u = r0 / r1;
     33        r0 = r0 % r1;
     34        q0 = u*q1 + q0;
     35        if ( r0 > 0 ) {
     36            u = r1 / r0;
     37            r1 = r1 % r0;
     38            q1 = u*q0 + q1;
     39        }
    3440    }
    35   }
    36   if ( r0 == 0 )
    37     return (ff_invtab[a] = -q1);
    38   else
    39     return (ff_invtab[a] = q0);
     41    if ( r0 == 0 )
     42        return (ff_invtab[a] = -q1);
     43    else
     44        return (ff_invtab[a] = q0);
    4045}
     46
     47int ff_biginv ( const int a )
     48{
     49    int u, r0 = a, r1 = ff_prime, q0 = 1, q1 = 0;
     50    while ( ( r0 > 0 ) && ( r1 > 0 ) ) {
     51        u = r0 / r1;
     52        r0 = r0 % r1;
     53        q0 = u*q1 + q0;
     54        if ( r0 > 0 ) {
     55            u = r1 / r0;
     56            r1 = r1 % r0;
     57            q1 = u*q0 + q1;
     58        }
     59    }
     60    if ( r0 == 0 )
     61        return -q1;
     62    else
     63        return q0;
     64}
  • factory/ffops.h

    r35930b r02af91  
    11// emacs edit mode for this file is -*- C++ -*-
    2 // $Id: ffops.h,v 1.0 1996-05-17 10:59:40 stobbe Exp $
     2// $Id: ffops.h,v 1.1 1996-06-18 06:57:00 stobbe Exp $
    33
    44#ifndef INCL_FFOPS_H
     
    77/*
    88$Log: not supported by cvs2svn $
     9Revision 1.0  1996/05/17 10:59:40  stobbe
     10Initial revision
     11
    912*/
    1013
     
    1518extern int ff_halfprime;
    1619extern short * ff_invtab;
     20extern bool ff_big;
    1721
    1822int ff_newinv ( const int );
     23int ff_biginv ( const int );
    1924void ff_setprime ( const int );
    2025
    2126inline int ff_norm ( const int a )
    2227{
    23   int n = a % ff_prime;
    24   if ( n < 0 )
    25     return n + ff_prime;
    26   else
    27     return n;
     28    int n = a % ff_prime;
     29    if ( n < 0 )
     30        return n + ff_prime;
     31    else
     32        return n;
    2833}
    2934
     
    3843inline int ff_longnorm ( const long a )
    3944{
    40   int n = (int)(a % (long)ff_prime);
    41   if ( n < 0 )
    42     return n + ff_prime;
    43   else
    44     return n;
     45    int n = (int)(a % (long)ff_prime);
     46    if ( n < 0 )
     47        return n + ff_prime;
     48    else
     49        return n;
     50}
     51
     52inline int ff_bignorm ( const long long int a )
     53{
     54    int n = (int)(a % (long long int)ff_prime);
     55    if ( n < 0 )
     56        return n + ff_prime;
     57    else
     58        return n;
    4559}
    4660
    4761inline int ff_add ( const int a, const int b )
    4862{
    49   return ff_norm( a + b );
     63    return ff_norm( a + b );
    5064}
    5165
    5266inline int ff_sub ( const int a, const int b )
    5367{
    54   return ff_norm( a - b );
     68    return ff_norm( a - b );
    5569}
    5670
    5771inline int ff_neg ( const int a )
    5872{
    59   return ff_norm( -a );
     73    return ff_norm( -a );
    6074}
    6175
    6276inline int ff_mul ( const int a, const int b )
    6377{
    64   return ff_longnorm ( (long)a * (long)b );
     78    if ( ff_big )
     79        return ff_bignorm( (long long int)a * (long long int)b );
     80    else
     81        return ff_longnorm ( (long)a * (long)b );
    6582}
    6683
    6784inline int ff_inv ( const int a )
    6885{
    69   register b;
    70   if ( (b = (int)(ff_invtab[a])) )
    71     return b;
    72   else
    73     return ff_newinv( a );
     86    if ( ff_big )
     87        return ff_biginv( a );
     88    else {
     89        register b;
     90        if ( (b = (int)(ff_invtab[a])) )
     91            return b;
     92        else
     93            return ff_newinv( a );
     94    }
     95   
    7496}
    7597
    7698inline int ff_div ( const int a, const int b )
    7799{
    78   return ff_mul( a, ff_inv( b ) );
     100    return ff_mul( a, ff_inv( b ) );
    79101}
    80102
    81103#endif /* INCL_FFOPS_H */
    82 
    83 
    84 
    85 
    86 
    87 
Note: See TracChangeset for help on using the changeset viewer.