source: git/factory/ffops.h @ 0df59c8

spielwiese
Last change on this file since 0df59c8 was 362fc67, checked in by Martin Lee <martinlee84@…>, 12 years ago
chg: remove $Id$
  • Property mode set to 100644
File size: 2.6 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 int ff_symmetric( const int a )
40{
41    if ( cf_glob_switches.isOn( SW_SYMMETRIC_FF ) )
42        return ( a > ff_halfprime ) ? a - ff_prime : a;
43    else
44        return a;
45}
46
47inline int ff_longnorm ( const long a )
48{
49    int n = (int)(a % (long)ff_prime);
50#if defined(i386) || defined(NTL_AVOID_BRANCHING)
51    n += (n >> 31) & ff_prime;
52    return n;
53#else
54    if (n < 0) n += ff_prime;
55    return n;
56#endif
57}
58
59inline int ff_bignorm ( const INT64 a )
60{
61    int n = (int)(a % (INT64)ff_prime);
62#if defined(i386) || defined(NTL_AVOID_BRANCHING)
63    n += (n >> 31) & ff_prime;
64    return n;
65#else
66    if (n < 0) n += ff_prime;
67    return n;
68#endif
69}
70
71inline int ff_add ( const int a, const int b )
72{
73    //return ff_norm( a + b );
74#if defined(i386) || defined(NTL_AVOID_BRANCHING)
75    int r=( a + b );
76    r -= ff_prime;
77    r += (r >> 31) & ff_prime;
78    return r;
79#else
80    int r=( a + b );
81    if (r >= ff_prime) r -= ff_prime;
82    return r;
83#endif
84}
85
86inline int ff_sub ( const int a, const int b )
87{
88    //return ff_norm( a - b );
89#if defined(i386) || defined(NTL_AVOID_BRANCHING)
90    int r=( a - b );
91    r += (r >> 31) & ff_prime;
92    return r;
93#else
94    int r=( a - b );
95    if (r < 0) r += ff_prime;
96    return r;
97#endif
98}
99
100inline int ff_neg ( const int a )
101{
102    //return ff_norm( -a );
103// EXPERIMENT
104#if defined(i386) || defined(NTL_AVOID_BRANCHING)
105    int r= -a;
106    r += (r >> 31) & ff_prime;
107    return r;
108#else
109    return ( a == 0 ? 0 : ff_prime-a );
110#endif
111}
112
113inline int ff_mul ( const int a, const int b )
114{
115    if ( ff_big )
116        return ff_bignorm( (INT64)a * (INT64)b );
117    else
118        return ff_longnorm ( (long)a * (long)b );
119}
120
121inline int ff_inv ( const int a )
122{
123    if ( ff_big )
124        return ff_biginv( a );
125    else {
126        register int b;
127        if ( (b = (int)(ff_invtab[a])) )
128            return b;
129        else
130            return ff_newinv( a );
131    }
132
133}
134
135inline int ff_div ( const int a, const int b )
136{
137    return ff_mul( a, ff_inv( b ) );
138}
139
140#endif /* ! INCL_FFOPS_H */
Note: See TracBrowser for help on using the repository browser.