Changeset 02af91 in git
- Timestamp:
- Jun 18, 1996, 8:57:00 AM (27 years ago)
- Branches:
- (u'spielwiese', '8e0ad00ce244dfd0756200662572aef8402f13d5')
- Children:
- cfa45ec3cccf336939c446d85de2dca6283593b1
- Parents:
- 35930b6cf4435468b76d893cb0f2be0e692720cf
- Location:
- factory
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
factory/ffops.cc
r35930b r02af91 1 1 // emacs edit mode for this file is -*- C++ -*- 2 // $Id: ffops.cc,v 1. 0 1996-05-17 10:59:46stobbe Exp $2 // $Id: ffops.cc,v 1.1 1996-06-18 06:57:00 stobbe Exp $ 3 3 4 4 /* 5 5 $Log: not supported by cvs2svn $ 6 Revision 1.0 1996/05/17 10:59:46 stobbe 7 Initial revision 8 6 9 */ 7 10 … … 12 15 int ff_prime = 31991; 13 16 int ff_halfprime = 31991 / 2; 17 bool ff_big = false; 14 18 short * ff_invtab = new short [31991]; 15 19 16 20 void ff_setprime ( const int p ) 17 21 { 18 ff_prime = p; 19 ff_halfprime = ff_prime / 2; 20 for ( int i = 0; i < ff_prime; i++ ) ff_invtab[i] = 0; 22 ff_prime = p; 23 ff_halfprime = ff_prime / 2; 24 if ( ! ff_big ) 25 for ( int i = 0; i < ff_prime; i++ ) ff_invtab[i] = 0; 21 26 } 22 27 23 28 int ff_newinv ( const int a ) 24 29 { 25 int u, r0 = a, r1 = ff_prime, q0 = 1, q1 = 0; 26 while ( ( r0 > 0 ) && ( r1 > 0 ) ) { 27 u = r0 / r1; 28 r0 = r0 % r1; 29 q0 = u*q1 + q0; 30 if ( r0 > 0 ) { 31 u = r1 / r0; 32 r1 = r1 % r0; 33 q1 = u*q0 + q1; 30 int u, r0 = a, r1 = ff_prime, q0 = 1, q1 = 0; 31 while ( ( r0 > 0 ) && ( r1 > 0 ) ) { 32 u = r0 / r1; 33 r0 = r0 % r1; 34 q0 = u*q1 + q0; 35 if ( r0 > 0 ) { 36 u = r1 / r0; 37 r1 = r1 % r0; 38 q1 = u*q0 + q1; 39 } 34 40 } 35 } 36 if ( r0 == 0 ) 37 return (ff_invtab[a] = -q1); 38 else 39 return (ff_invtab[a] = q0); 41 if ( r0 == 0 ) 42 return (ff_invtab[a] = -q1); 43 else 44 return (ff_invtab[a] = q0); 40 45 } 46 47 int ff_biginv ( const int a ) 48 { 49 int u, r0 = a, r1 = ff_prime, q0 = 1, q1 = 0; 50 while ( ( r0 > 0 ) && ( r1 > 0 ) ) { 51 u = r0 / r1; 52 r0 = r0 % r1; 53 q0 = u*q1 + q0; 54 if ( r0 > 0 ) { 55 u = r1 / r0; 56 r1 = r1 % r0; 57 q1 = u*q0 + q1; 58 } 59 } 60 if ( r0 == 0 ) 61 return -q1; 62 else 63 return q0; 64 } -
factory/ffops.h
r35930b r02af91 1 1 // emacs edit mode for this file is -*- C++ -*- 2 // $Id: ffops.h,v 1. 0 1996-05-17 10:59:40 stobbe Exp $2 // $Id: ffops.h,v 1.1 1996-06-18 06:57:00 stobbe Exp $ 3 3 4 4 #ifndef INCL_FFOPS_H … … 7 7 /* 8 8 $Log: not supported by cvs2svn $ 9 Revision 1.0 1996/05/17 10:59:40 stobbe 10 Initial revision 11 9 12 */ 10 13 … … 15 18 extern int ff_halfprime; 16 19 extern short * ff_invtab; 20 extern bool ff_big; 17 21 18 22 int ff_newinv ( const int ); 23 int ff_biginv ( const int ); 19 24 void ff_setprime ( const int ); 20 25 21 26 inline int ff_norm ( const int a ) 22 27 { 23 int n = a % ff_prime;24 if ( n < 0 )25 26 else27 28 int n = a % ff_prime; 29 if ( n < 0 ) 30 return n + ff_prime; 31 else 32 return n; 28 33 } 29 34 … … 38 43 inline int ff_longnorm ( const long a ) 39 44 { 40 int n = (int)(a % (long)ff_prime); 41 if ( n < 0 ) 42 return n + ff_prime; 43 else 44 return n; 45 int n = (int)(a % (long)ff_prime); 46 if ( n < 0 ) 47 return n + ff_prime; 48 else 49 return n; 50 } 51 52 inline int ff_bignorm ( const long long int a ) 53 { 54 int n = (int)(a % (long long int)ff_prime); 55 if ( n < 0 ) 56 return n + ff_prime; 57 else 58 return n; 45 59 } 46 60 47 61 inline int ff_add ( const int a, const int b ) 48 62 { 49 return ff_norm( a + b );63 return ff_norm( a + b ); 50 64 } 51 65 52 66 inline int ff_sub ( const int a, const int b ) 53 67 { 54 return ff_norm( a - b );68 return ff_norm( a - b ); 55 69 } 56 70 57 71 inline int ff_neg ( const int a ) 58 72 { 59 return ff_norm( -a );73 return ff_norm( -a ); 60 74 } 61 75 62 76 inline int ff_mul ( const int a, const int b ) 63 77 { 64 return ff_longnorm ( (long)a * (long)b ); 78 if ( ff_big ) 79 return ff_bignorm( (long long int)a * (long long int)b ); 80 else 81 return ff_longnorm ( (long)a * (long)b ); 65 82 } 66 83 67 84 inline int ff_inv ( const int a ) 68 85 { 69 register b; 70 if ( (b = (int)(ff_invtab[a])) ) 71 return b; 72 else 73 return ff_newinv( a ); 86 if ( ff_big ) 87 return ff_biginv( a ); 88 else { 89 register b; 90 if ( (b = (int)(ff_invtab[a])) ) 91 return b; 92 else 93 return ff_newinv( a ); 94 } 95 74 96 } 75 97 76 98 inline int ff_div ( const int a, const int b ) 77 99 { 78 return ff_mul( a, ff_inv( b ) );100 return ff_mul( a, ff_inv( b ) ); 79 101 } 80 102 81 103 #endif /* INCL_FFOPS_H */ 82 83 84 85 86 87
Note: See TracChangeset
for help on using the changeset viewer.