source: git/factory/ffops.h @ 86faff

spielwiese
Last change on this file since 86faff was 8710ff0, checked in by Martin Lee <martinlee84@…>, 12 years ago
chg: 64bit integers in factory by Adi Popescu
  • Property mode set to 100644
File size: 3.0 KB
Line 
1/* emacs edit mode for this file is -*- C++ -*- */
2
3#ifndef INCL_FFOPS_H
4#define INCL_FFOPS_H
5
6// #include "config.h"
7
8#include "cf_globals.h"
9#ifdef HAVE_NTL
10#include <NTL/config.h>
11#endif
12
13/* define type of your compilers 64 bit integer type */
14#ifndef INT64
15#define INT64 long long int
16#endif
17
18extern int ff_prime;
19extern int ff_halfprime;
20extern short * ff_invtab;
21extern bool ff_big;
22
23int ff_newinv ( const int );
24int ff_biginv ( const int );
25void ff_setprime ( const int );
26
27inline int ff_norm ( const int a )
28{
29    int n = a % ff_prime;
30#if defined(i386) || defined(NTL_AVOID_BRANCHING)
31    n += (n >> 31) & ff_prime;
32    return n;
33#else
34    if (n < 0) n += ff_prime;
35    return n;
36#endif
37}
38
39inline long ff_norm ( const long a )
40{
41    long n = a % ff_prime;
42#if defined(i386) || defined(NTL_AVOID_BRANCHING)
43    n += (n >> 31) & ff_prime;
44    return n;
45#else
46    if (n < 0) n += ff_prime;
47    return n;
48#endif
49}
50
51inline int ff_symmetric( const int a )
52{
53    if ( cf_glob_switches.isOn( SW_SYMMETRIC_FF ) )
54        return ( a > ff_halfprime ) ? a - ff_prime : a;
55    else
56        return a;
57}
58
59inline long ff_symmetric( const long a )
60{
61    if ( cf_glob_switches.isOn( SW_SYMMETRIC_FF ) )
62        return ( a > ff_halfprime ) ? a - ff_prime : a;
63    else
64        return a;
65}
66
67inline int ff_longnorm ( const long a )
68{
69    int n = (int)(a % (long)ff_prime);
70#if defined(i386) || defined(NTL_AVOID_BRANCHING)
71    n += (n >> 31) & ff_prime;
72    return n;
73#else
74    if (n < 0) n += ff_prime;
75    return n;
76#endif
77}
78
79inline int ff_bignorm ( const INT64 a )
80{
81    int n = (int)(a % (INT64)ff_prime);
82#if defined(i386) || defined(NTL_AVOID_BRANCHING)
83    n += (n >> 31) & ff_prime;
84    return n;
85#else
86    if (n < 0) n += ff_prime;
87    return n;
88#endif
89}
90
91inline int ff_add ( const int a, const int b )
92{
93    //return ff_norm( a + b );
94#if defined(i386) || defined(NTL_AVOID_BRANCHING)
95    int r=( a + b );
96    r -= ff_prime;
97    r += (r >> 31) & ff_prime;
98    return r;
99#else
100    int r=( a + b );
101    if (r >= ff_prime) r -= ff_prime;
102    return r;
103#endif
104}
105
106inline int ff_sub ( const int a, const int b )
107{
108    //return ff_norm( a - b );
109#if defined(i386) || defined(NTL_AVOID_BRANCHING)
110    int r=( a - b );
111    r += (r >> 31) & ff_prime;
112    return r;
113#else
114    int r=( a - b );
115    if (r < 0) r += ff_prime;
116    return r;
117#endif
118}
119
120inline int ff_neg ( const int a )
121{
122    //return ff_norm( -a );
123// EXPERIMENT
124#if defined(i386) || defined(NTL_AVOID_BRANCHING)
125    int r= -a;
126    r += (r >> 31) & ff_prime;
127    return r;
128#else
129    return ( a == 0 ? 0 : ff_prime-a );
130#endif
131}
132
133inline int ff_mul ( const int a, const int b )
134{
135    if ( ff_big )
136        return ff_bignorm( (INT64)a * (INT64)b );
137    else
138        return ff_longnorm ( (long)a * (long)b );
139}
140
141inline int ff_inv ( const int a )
142{
143    if ( ff_big )
144        return ff_biginv( a );
145    else {
146        register int b;
147        if ( (b = (int)(ff_invtab[a])) )
148            return b;
149        else
150            return ff_newinv( a );
151    }
152
153}
154
155inline int ff_div ( const int a, const int b )
156{
157    return ff_mul( a, ff_inv( b ) );
158}
159
160#endif /* ! INCL_FFOPS_H */
Note: See TracBrowser for help on using the repository browser.