| 
					
				 | 
			
			
				@@ -10,6 +10,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <openssl/bn.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "qa/questions/questions.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "qa/questions/qarith.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "qa/questions/qwiener.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -135,51 +136,6 @@ bigfraction_t* cf_next(cf_t *f) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * \brief Square Root for bignums. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * An implementation of Dijkstra's Square Root Algorithm. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * A Discipline of Programming, page 61 - Fifth Exercise. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * \return true if rem is equal to zero, false otherwise. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-int BN_sqrtmod(BIGNUM* dv, BIGNUM* rem, BIGNUM* a, BN_CTX* ctx) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  BIGNUM *shift; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  BIGNUM *adj; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  shift = BN_new(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  adj = BN_new(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  BN_zero(dv); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  BN_copy(rem, a); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  /* hacking into internal sequence to skip some cycles. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  /* for  (BN_one(shift);     original */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (bn_wexpand(shift, a->top+1), shift->top=a->top, shift->d[shift->top-1] = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       BN_ucmp(shift, rem) != 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       /* BN_rshift(shift, shift, 2); */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       BN_lshift1(shift, shift), BN_lshift1(shift, shift)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  while (!BN_is_one(shift)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /* BN_rshift(shift, shift, 2); */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    BN_rshift1(shift, shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    BN_rshift1(shift, shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    BN_uadd(adj, dv, shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    BN_rshift1(dv, dv); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (BN_ucmp(rem, adj) != -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      BN_uadd(dv, dv, shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      BN_usub(rem, rem, adj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  BN_free(shift); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  BN_free(adj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return BN_is_zero(rem); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *  Weiner Attack Implementation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 |