1 #include "LiDIA/bigint.h"
2 #include "LiDIA/gec_complex_multiplication.h"
3 #include "LiDIA/gec_point_counting_mod_p.h"
4 #include "LiDIA/gec_point_counting_mod_2n.h"
5 
6 #include "LiDIA/timer.h"
7 
8 #ifdef LIDIA_NAMESPACE
9 using namespace LiDIA;
10 #endif
11 
main_LiDIA(int,char **)12 int main_LiDIA(int, char**)
13 {
14    lidia_size_t bitlength_r;
15    std::cout << "Input lower bound of bitlength of r >> ";
16    std::cin >> bitlength_r;
17 
18    bool verbosity = true;
19    bool efficiency = true;
20 
21    bigint bound_k;
22    std::cout << "Input upper_bound_k (k is the cofactor) >> ";
23    std::cin >> bound_k;
24 
25    bool bsi = false;
26    bigint field;
27    std::cout << "Input field GF(q) (q ~ r * k) >> ";
28    std::cin >> field;
29 
30    char method;
31    std::cout << "Input method (c = CM), (p = PC mod p), (2 = PC mod 2^n) >> ";
32    std::cin >> method;
33 
34    if( method == 'c' )
35    {
36 	   std::cout << "We use complex multiplication." << std::endl;
37 
38 	   gec_complex_multiplication I;
39 	   I.set_lower_bound_bitlength_r( bitlength_r );
40 	   I.set_upper_bound_k( bound_k );
41 	   I.set_according_to_BSI( bsi );
42 
43 	   bigint delta( -21311 );
44 	   std::cout << "Input delta >> "; std::cin >> delta;
45 	   if( delta != 0 )
46 		   I.set_delta(delta);
47 
48 	   if( field != 0 )
49 		   I.set_field( field );
50 
51 	   I.set_verbose_level( verbosity );
52 //	   I.set_generation_mode( 1 );
53 //	   I.set_efficient_curve_parameters( efficiency );
54 
55 	   timer all_time;
56 
57 	   all_time.start_timer();
58 	   I.generate();
59 	   all_time.stop_timer();
60 
61 //	   std::cout << I.get_class_polynomial() << std::endl;
62 
63 	   std::cout << I.get_a4() << std::endl;
64 	   std::cout << I.get_a4().return_as_bigint() << std::endl;
65 
66 	   std::cout << std::endl << "all_time = " << all_time << std::endl;
67 
68    }
69    else if( method == 'p' )
70    {
71 	   std::cout << "We use random approach." << std::endl;
72 
73 	   gec_point_counting_mod_p I;
74 	   I.set_lower_bound_bitlength_r( bitlength_r );
75 	   I.set_upper_bound_k( bound_k );
76 	   I.set_according_to_BSI( bsi );
77 
78 	   if( field != 0 )
79 		   I.set_field( field );
80 
81 	   I.set_verbose_level( verbosity );
82 //	   I.set_efficient_curve_parameters( efficiency );
83 
84 	   I.generate();
85    }
86    else if( method == '2' )
87    {
88 	   gec_point_counting_mod_2n I;
89 	   I.set_lower_bound_bitlength_r( bitlength_r );
90 	   I.set_upper_bound_k( bound_k );
91 	   I.set_according_to_BSI( bsi );
92 
93 	   unsigned int degree;
94 	   std::cout << "Input degree >> "; std::cin >> degree;
95 
96 	   if( degree != 0 )
97 		   I.set_degree( degree );
98 	   else if( field != 0 )
99 		   I.set_field( field );
100 
101 	   I.set_verbose_level( verbosity );
102 	   I.set_efficient_curve_parameters( efficiency );
103 
104 	   I.generate();
105    }
106 
107    return( 0 );
108 }
109 
110 
main(int argc,char ** argv)111 int main(int argc, char** argv) {
112 
113 #if defined(LIDIA_EXCEPTIONS)
114     try {
115 #endif
116 
117 	main_LiDIA(argc, argv);
118 
119 #if defined(LIDIA_EXCEPTIONS)
120     }
121     catch(basic_error const& ex) {
122 	ex.traditional_error_handler();
123 	return 1;
124     }
125     catch(std::exception const& ex) {
126 	std::cerr << "unexpected exception: " << ex.what() << "\n";
127 	return 1;
128     }
129 #endif
130 
131 }
132