11#pragma once
22
33#include " functions/internal/modexp_impl.cu"
4- #include " functions /monty_mul.cu"
4+ #include " modnum /monty_mul.cu"
55
66namespace cuFIXNUM {
77
8- template < typename fixnum >
8+ template < typename modnum_tp >
99class modexp {
10+ typedef typename modnum_tp::fixnum fixnum;
1011 typedef typename fixnum::digit digit;
1112
1213 // Decomposition of the exponent for use in the constant-width sliding-window
@@ -17,9 +18,7 @@ class modexp {
1718 int exp_wins_len;
1819 int window_size;
1920
20- // TODO: Generalise modexp so that it can work with any modular
21- // multiplication algorithm.
22- const monty_mul<fixnum> monty;
21+ const modnum_tp modnum;
2322
2423 // Helper functions for decomposing the exponent into windows.
2524 __device__ uint32_t
@@ -44,9 +43,9 @@ public:
4443};
4544
4645
47- template < typename fixnum >
46+ template < typename modnum_tp >
4847__device__ uint32_t
49- modexp<fixnum >::scan_nonzero_window(int &hi_idx, fixnum &n, int max_window_bits) {
48+ modexp<modnum_tp >::scan_nonzero_window(int &hi_idx, fixnum &n, int max_window_bits) {
5049 uint32_t bits_remaining = hi_idx + 1 , win_bits;
5150 digit w, lsd = fixnum::bottom_digit (n);
5251
@@ -59,19 +58,19 @@ modexp<fixnum>::scan_nonzero_window(int &hi_idx, fixnum &n, int max_window_bits)
5958}
6059
6160
62- template < typename fixnum >
61+ template < typename modnum_tp >
6362__device__ int
64- modexp<fixnum >::scan_zero_window(int &hi_idx, fixnum &n) {
63+ modexp<modnum_tp >::scan_zero_window(int &hi_idx, fixnum &n) {
6564 int nzeros = fixnum::two_valuation (n);
6665 fixnum::rshift (n, n, nzeros);
6766 hi_idx -= nzeros;
6867 return nzeros;
6968}
7069
7170
72- template < typename fixnum >
71+ template < typename modnum_tp >
7372__device__ uint32_t
74- modexp<fixnum >::scan_window(int &hi_idx, fixnum &n, int max_window_bits) {
73+ modexp<modnum_tp >::scan_window(int &hi_idx, fixnum &n, int max_window_bits) {
7574 int nzeros;
7675 uint32_t window;
7776 nzeros = scan_zero_window (hi_idx, n);
@@ -82,10 +81,10 @@ modexp<fixnum>::scan_window(int &hi_idx, fixnum &n, int max_window_bits) {
8281}
8382
8483
85- template < typename fixnum >
84+ template < typename modnum_tp >
8685__device__
87- modexp<fixnum >::modexp(fixnum mod, fixnum exp)
88- : monty (mod)
86+ modexp<modnum_tp >::modexp(fixnum mod, fixnum exp)
87+ : modnum (mod)
8988{
9089 // sliding window decomposition
9190 int hi_idx;
@@ -115,18 +114,18 @@ modexp<fixnum>::modexp(fixnum mod, fixnum exp)
115114}
116115
117116
118- template < typename fixnum >
117+ template < typename modnum_tp >
119118__device__
120- modexp<fixnum >::~modexp ()
119+ modexp<modnum_tp >::~modexp ()
121120{
122121 if (fixnum::layout::laneIdx () == 0 )
123122 free (exp_wins);
124123}
125124
126125
127- template < typename fixnum >
126+ template < typename modnum_tp >
128127__device__ void
129- modexp<fixnum >::operator ()(fixnum &z, fixnum x) const
128+ modexp<modnum_tp >::operator ()(fixnum &z, fixnum x) const
130129{
131130 static constexpr int WINDOW_MAX_BITS = 16 ;
132131 static constexpr int WINDOW_LEN_MASK = (1UL << WINDOW_MAX_BITS) - 1UL ;
@@ -143,7 +142,7 @@ modexp<fixnum>::operator()(fixnum &z, fixnum x) const
143142 // z = fixnum::one();
144143 // TODO: This complicated way of producing a 1 is to
145144 // accommodate the possibility that monty.is_valid is false.
146- monty. from_monty (z, monty .one ());
145+ modnum. from_modnum (z, modnum .one ());
147146 return ;
148147 }
149148
@@ -152,13 +151,13 @@ modexp<fixnum>::operator()(fixnum &z, fixnum x) const
152151 int window_max = 1U << window_size;
153152 /* G[t] = z^(2t + 1) t >= 0 (odd powers of z) */
154153 fixnum G[WINDOW_MAX_VAL_REDUCED / 2 ];
155- monty. to_monty (z, x);
154+ modnum. to_modnum (z, x);
156155 G[0 ] = z;
157156 if (window_size > 1 ) {
158- monty (z, z);
157+ modnum. sqr (z, z);
159158 for (int t = 1 ; t < window_max / 2 ; ++t) {
160159 G[t] = G[t - 1 ];
161- monty (G[t], G[t], z);
160+ modnum. mul (G[t], G[t], z);
162161 }
163162 }
164163
@@ -171,22 +170,22 @@ modexp<fixnum>::operator()(fixnum &z, fixnum x) const
171170
172171 z = G[e / 2 ];
173172 while (two_val-- > 0 )
174- monty (z, z);
173+ modnum. sqr (z, z);
175174
176175 while (windows >= exp_wins) {
177176 two_val = window_size;
178177 while (two_val-- > 0 )
179- monty (z, z);
178+ modnum. sqr (z, z);
180179
181180 win = *windows--;
182181 two_val = win & WINDOW_LEN_MASK;
183182 e = win >> WINDOW_MAX_BITS;
184183
185- monty (z, z, G[e / 2 ]);
184+ modnum. mul (z, z, G[e / 2 ]);
186185 while (two_val-- > 0 )
187- monty (z, z);
186+ modnum. sqr (z, z);
188187 }
189- monty. from_monty (z, z);
188+ modnum. from_modnum (z, z);
190189}
191190
192191} // End namespace cuFIXNUM
0 commit comments