source: git/factory/ffops.h @ 650f2d8

spielwiese
Last change on this file since 650f2d8 was 806c18, checked in by Hans Schoenemann <hannes@…>, 13 years ago
format git-svn-id: file:///usr/local/Singular/svn/trunk@13655 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 2.6 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2/* $Id$ */
3
4#ifndef INCL_FFOPS_H
5#define INCL_FFOPS_H
6
7#include <config.h>
8
9#include "cf_globals.h"
10#ifdef HAVE_NTL
11#include <NTL/config.h>
12#endif
13
14extern int ff_prime;
15extern int ff_halfprime;
16extern short * ff_invtab;
17extern bool ff_big;
18
19int ff_newinv ( const int );
20int ff_biginv ( const int );
21void ff_setprime ( const int );
22
23inline int ff_norm ( const int a )
24{
25    int n = a % ff_prime;
26#if defined(i386) || defined(NTL_AVOID_BRANCHING)
27    n += (n >> 31) & ff_prime;
28    return n;
29#else
30    if (n < 0) n += ff_prime;
31    return n;
32#endif
33}
34
35inline int ff_symmetric( const int a )
36{
37    if ( cf_glob_switches.isOn( SW_SYMMETRIC_FF ) )
38        return ( a > ff_halfprime ) ? a - ff_prime : a;
39    else
40        return a;
41}
42
43inline int ff_longnorm ( const long a )
44{
45    int n = (int)(a % (long)ff_prime);
46#if defined(i386) || defined(NTL_AVOID_BRANCHING)
47    n += (n >> 31) & ff_prime;
48    return n;
49#else
50    if (n < 0) n += ff_prime;
51    return n;
52#endif
53}
54
55inline int ff_bignorm ( const INT64 a )
56{
57    int n = (int)(a % (INT64)ff_prime);
58#if defined(i386) || defined(NTL_AVOID_BRANCHING)
59    n += (n >> 31) & ff_prime;
60    return n;
61#else
62    if (n < 0) n += ff_prime;
63    return n;
64#endif
65}
66
67inline int ff_add ( const int a, const int b )
68{
69    //return ff_norm( a + b );
70#if defined(i386) || defined(NTL_AVOID_BRANCHING)
71    int r=( a + b );
72    r -= ff_prime;
73    r += (r >> 31) & ff_prime;
74    return r;
75#else
76    int r=( a + b );
77    if (r >= ff_prime) r -= ff_prime;
78    return r;
79#endif
80}
81
82inline int ff_sub ( const int a, const int b )
83{
84    //return ff_norm( a - b );
85#if defined(i386) || defined(NTL_AVOID_BRANCHING)
86    int r=( a - b );
87    r += (r >> 31) & ff_prime;
88    return r;
89#else
90    int r=( a - b );
91    if (r < 0) r += ff_prime;
92    return r;
93#endif
94}
95
96inline int ff_neg ( const int a )
97{
98    //return ff_norm( -a );
99// EXPERIMENT
100#if defined(i386) || defined(NTL_AVOID_BRANCHING)
101    int r= -a;
102    r += (r >> 31) & ff_prime;
103    return r;
104#else
105    return ( a == 0 ? 0 : ff_prime-a );
106#endif
107}
108
109inline int ff_mul ( const int a, const int b )
110{
111    if ( ff_big )
112        return ff_bignorm( (INT64)a * (INT64)b );
113    else
114        return ff_longnorm ( (long)a * (long)b );
115}
116
117inline int ff_inv ( const int a )
118{
119    if ( ff_big )
120        return ff_biginv( a );
121    else {
122        register int b;
123        if ( (b = (int)(ff_invtab[a])) )
124            return b;
125        else
126            return ff_newinv( a );
127    }
128
129}
130
131inline int ff_div ( const int a, const int b )
132{
133    return ff_mul( a, ff_inv( b ) );
134}
135
136#endif /* ! INCL_FFOPS_H */
Note: See TracBrowser for help on using the repository browser.