source: git/factory/ffops.h @ 79cf7d0

spielwiese
Last change on this file since 79cf7d0 was 79cf7d0, checked in by Hans Schönemann <hannes@…>, 18 years ago
*hannes: optimizing arith in Z/p git-svn-id: file:///usr/local/Singular/svn/trunk@8792 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 1.9 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2/* $Id: ffops.h,v 1.8 2005-11-08 16:03:18 Singular Exp $ */
3
4#ifndef INCL_FFOPS_H
5#define INCL_FFOPS_H
6
7#include <config.h>
8
9#include "cf_globals.h"
10
11extern int ff_prime;
12extern int ff_halfprime;
13extern short * ff_invtab;
14extern bool ff_big;
15
16int ff_newinv ( const int );
17int ff_biginv ( const int );
18void ff_setprime ( const int );
19
20inline int ff_norm ( const int a )
21{
22    int n = a % ff_prime;
23    if ( n < 0 )
24        return n + ff_prime;
25    else
26        return n;
27}
28
29inline int ff_symmetric( const int a )
30{
31    if ( cf_glob_switches.isOn( SW_SYMMETRIC_FF ) )
32        return ( a > ff_halfprime ) ? a - ff_prime : a;
33    else
34        return a;
35}
36
37inline int ff_longnorm ( const long a )
38{
39    int n = (int)(a % (long)ff_prime);
40    if ( n < 0 )
41        return n + ff_prime;
42    else
43        return n;
44}
45
46#ifndef __MWERKS__
47inline int ff_bignorm ( const INT64 a )
48{
49    int n = (int)(a % (INT64)ff_prime);
50    if ( n < 0 )
51        return n + ff_prime;
52    else
53        return n;
54}
55#endif
56
57inline int ff_add ( const int a, const int b )
58{
59    //return ff_norm( a + b );
60    int r=( a + b );
61    if (r >= ff_prime) r -= ff_prime;
62    return r;
63}
64
65inline int ff_sub ( const int a, const int b )
66{
67    //return ff_norm( a - b );
68    int r=( a - b );
69    if (r <0) r += ff_prime;
70    return r;
71}
72
73inline int ff_neg ( const int a )
74{
75    //return ff_norm( -a );
76    if (a==0) return 0;
77    return ff_prime-a;
78}
79
80#ifdef __MWERKS__
81int ff_mul ( const int a, const int b );
82#else
83inline int ff_mul ( const int a, const int b )
84{
85    if ( ff_big )
86        return ff_bignorm( (INT64)a * (INT64)b );
87    else
88        return ff_longnorm ( (long)a * (long)b );
89}
90#endif
91
92inline int ff_inv ( const int a )
93{
94    if ( ff_big )
95        return ff_biginv( a );
96    else {
97        register int b;
98        if ( (b = (int)(ff_invtab[a])) )
99            return b;
100        else
101            return ff_newinv( a );
102    }
103
104}
105
106inline int ff_div ( const int a, const int b )
107{
108    return ff_mul( a, ff_inv( b ) );
109}
110
111#endif /* ! INCL_FFOPS_H */
Note: See TracBrowser for help on using the repository browser.