| 
					
				 | 
			
			
				@@ -1,3 +1,5 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "config.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <stdint.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <stdlib.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -12,7 +14,7 @@ fbase_ptr fb_init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   fbase_ptr pb = (fbase_ptr) calloc(FB_FRAMES, sizeof(fbase_unit)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (size_t j = 0; j < FB_FRAMES; j++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (size_t i = 0; i <= 0xFF; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (size_t i = 0; i <= FB_MASK; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       mpz_init(pb[j][i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -23,10 +25,12 @@ void fb_set_small(fbase_t pb, const mpz_t n) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   mpz_t e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   mpz_init(e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (size_t j = 0; j < FB_FRAMES/2; j++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (size_t i = 0; i <= 0xFF; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      uint64_t e =  (0x01 <<  8*j) * i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t j = 0; j < (FB_FRAMES)/2; j++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (size_t i = 0; i <= FB_MASK; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      uint64_t e =  (0x01 <<  (FB_BASE)*j) * i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       powmp_ui(pb[j][i], n, e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      /* force size to be constant. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       _mpz_realloc(pb[j][i], 24); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       SIZ(pb[j][i]) = 24; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -38,8 +42,10 @@ void fb_set_small(fbase_t pb, const mpz_t n) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void fb_copy(fbase_t dst, fbase_t source) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (size_t j = 0; j < FB_FRAMES; j++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (size_t i = 0; i <= 0xFF; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (size_t i = 0; i <= FB_MASK; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       mpz_set(dst[j][i], source[j][i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      /* force size to be constant */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       _mpz_realloc(dst[j][i], 24); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       SIZ(dst[j][i]) = 24; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -51,9 +57,9 @@ void fb_set(fbase_t pb, const mpz_t n) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   mpz_t e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   mpz_init(e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (size_t j = 0; j < FB_FRAMES; j++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (size_t i = 0; i <= 0xFF; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (size_t i = 0; i <= FB_MASK; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       mpz_set_ui(e, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      mpz_mul_2exp(e, e, 8*j); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      mpz_mul_2exp(e, e, (FB_BASE)*j); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       mpz_mul_ui(e, e, i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       mpz_powm(pb[j][i], n, e, p); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -66,7 +72,7 @@ void fb_clear(fbase_t pb) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (size_t j = 0; j < FB_FRAMES; j++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (size_t i = 0; i <= 0xFF; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for (size_t i = 0; i <= FB_MASK; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       mpz_clear(pb[j][i]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -77,13 +83,12 @@ void fb_clear(fbase_t pb) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void __attribute__((optimize("unroll-loops"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 fb_powmp_ui(mpz_t rop, fbase_t pb, const uint64_t exp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const uint8_t *e = (uint8_t *) &exp; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define e(i) ((exp >> (i * (FB_BASE))) & (FB_MASK)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  mpz_mul_modp(rop, pb[0][e[0]], pb[1][e[1]]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  mpz_mul_modp(rop, pb[0][e(0)], pb[1][e(1)]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (size_t j = 2; j < FB_FRAMES; j++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const size_t exp = e[j]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (exp != 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      mpz_mul_modp(rop, rop,  pb[j][exp]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (e(j) != 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      mpz_mul_modp(rop, rop,  pb[j][e(j)]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |