source: git/factory/ffops.h @ e4fe2b

jengelh-datetimespielwiese
Last change on this file since e4fe2b was e4fe2b, checked in by Oleksandr Motsak <motsak@…>, 11 years ago
FIX: Fixed huge BUG in cf_gmp.h CHG: starting to cleanup factory
  • Property mode set to 100644
File size: 2.7 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
14/* define type of your compilers 64 bit integer type */
15#ifndef INT64
16#define INT64 long long int
17#endif
18
19extern int ff_prime;
20extern int ff_halfprime;
21extern short * ff_invtab;
22extern bool ff_big;
23
24int ff_newinv ( const int );
25int ff_biginv ( const int );
26void ff_setprime ( const int );
27
28inline int ff_norm ( const int a )
29{
30    int n = a % ff_prime;
31#if defined(i386) || defined(NTL_AVOID_BRANCHING)
32    n += (n >> 31) & ff_prime;
33    return n;
34#else
35    if (n < 0) n += ff_prime;
36    return n;
37#endif
38}
39
40inline int ff_symmetric( const int a )
41{
42    if ( cf_glob_switches.isOn( SW_SYMMETRIC_FF ) )
43        return ( a > ff_halfprime ) ? a - ff_prime : a;
44    else
45        return a;
46}
47
48inline int ff_longnorm ( const long a )
49{
50    int n = (int)(a % (long)ff_prime);
51#if defined(i386) || defined(NTL_AVOID_BRANCHING)
52    n += (n >> 31) & ff_prime;
53    return n;
54#else
55    if (n < 0) n += ff_prime;
56    return n;
57#endif
58}
59
60inline int ff_bignorm ( const INT64 a )
61{
62    int n = (int)(a % (INT64)ff_prime);
63#if defined(i386) || defined(NTL_AVOID_BRANCHING)
64    n += (n >> 31) & ff_prime;
65    return n;
66#else
67    if (n < 0) n += ff_prime;
68    return n;
69#endif
70}
71
72inline int ff_add ( const int a, const int b )
73{
74    //return ff_norm( a + b );
75#if defined(i386) || defined(NTL_AVOID_BRANCHING)
76    int r=( a + b );
77    r -= ff_prime;
78    r += (r >> 31) & ff_prime;
79    return r;
80#else
81    int r=( a + b );
82    if (r >= ff_prime) r -= ff_prime;
83    return r;
84#endif
85}
86
87inline int ff_sub ( const int a, const int b )
88{
89    //return ff_norm( a - b );
90#if defined(i386) || defined(NTL_AVOID_BRANCHING)
91    int r=( a - b );
92    r += (r >> 31) & ff_prime;
93    return r;
94#else
95    int r=( a - b );
96    if (r < 0) r += ff_prime;
97    return r;
98#endif
99}
100
101inline int ff_neg ( const int a )
102{
103    //return ff_norm( -a );
104// EXPERIMENT
105#if defined(i386) || defined(NTL_AVOID_BRANCHING)
106    int r= -a;
107    r += (r >> 31) & ff_prime;
108    return r;
109#else
110    return ( a == 0 ? 0 : ff_prime-a );
111#endif
112}
113
114inline int ff_mul ( const int a, const int b )
115{
116    if ( ff_big )
117        return ff_bignorm( (INT64)a * (INT64)b );
118    else
119        return ff_longnorm ( (long)a * (long)b );
120}
121
122inline int ff_inv ( const int a )
123{
124    if ( ff_big )
125        return ff_biginv( a );
126    else {
127        register int b;
128        if ( (b = (int)(ff_invtab[a])) )
129            return b;
130        else
131            return ff_newinv( a );
132    }
133
134}
135
136inline int ff_div ( const int a, const int b )
137{
138    return ff_mul( a, ff_inv( b ) );
139}
140
141#endif /* ! INCL_FFOPS_H */
Note: See TracBrowser for help on using the repository browser.