aboutsummaryrefslogtreecommitdiff
path: root/src/Specific/Framework/ArithmeticSynthesis/MontgomeryPackage.v
blob: cefc0733fd74473456b72515b02c5f9d30768aaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
(* This file is autogenerated from Montgomery.v by remake_packages.py *)
Require Import Crypto.Specific.Framework.CurveParametersPackage.
Require Import Crypto.Specific.Framework.ArithmeticSynthesis.BasePackage.
Require Import Crypto.Specific.Framework.ArithmeticSynthesis.DefaultsPackage.
Require Import Crypto.Specific.Framework.ArithmeticSynthesis.FreezePackage.
Require Import Crypto.Specific.Framework.ArithmeticSynthesis.LadderstepPackage.
Require Export Crypto.Specific.Framework.ArithmeticSynthesis.Montgomery.
Require Import Crypto.Specific.Framework.Packages.
Require Import Crypto.Util.TagList.

Module TAG.
  Inductive tags := m' | r' | m'_correct | r'_correct | m_enc_correct_montgomery | r'_pow_correct | montgomery_to_F | r_big | m_big | m_enc_small | map_m_enc | mul_ext | add_ext | sub_ext | opp_ext | carry_ext | nonzero_ext | mul_bounded | add_bounded | sub_bounded | opp_bounded | carry_bounded | nonzero_sig.
End TAG.

Ltac add_m' pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let modinv_fuel := Tag.get pkg TAG.modinv_fuel in
                   let m := Tag.get pkg TAG.m in
                   let r := Tag.get pkg TAG.r in
                   let m' := fresh "m'" in
                   let m' := pose_m' modinv_fuel m r m' in
                   Tag.update pkg TAG.m' m')
    ltac:(fun _ => pkg)
    ().
Ltac add_r' pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let modinv_fuel := Tag.get pkg TAG.modinv_fuel in
                   let m := Tag.get pkg TAG.m in
                   let r := Tag.get pkg TAG.r in
                   let r' := fresh "r'" in
                   let r' := pose_r' modinv_fuel m r r' in
                   Tag.update pkg TAG.r' r')
    ltac:(fun _ => pkg)
    ().
Ltac add_m'_correct pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let m := Tag.get pkg TAG.m in
                   let m' := Tag.get pkg TAG.m' in
                   let r := Tag.get pkg TAG.r in
                   let m'_correct := fresh "m'_correct" in
                   let m'_correct := pose_m'_correct m m' r m'_correct in
                   Tag.update pkg TAG.m'_correct m'_correct)
    ltac:(fun _ => pkg)
    ().
Ltac add_r'_correct pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let m := Tag.get pkg TAG.m in
                   let r := Tag.get pkg TAG.r in
                   let r' := Tag.get pkg TAG.r' in
                   let r'_correct := fresh "r'_correct" in
                   let r'_correct := pose_r'_correct m r r' r'_correct in
                   Tag.update pkg TAG.r'_correct r'_correct)
    ltac:(fun _ => pkg)
    ().
Ltac add_m_enc_correct_montgomery pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let m := Tag.get pkg TAG.m in
                   let sz := Tag.get pkg TAG.sz in
                   let r := Tag.get pkg TAG.r in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let m_enc_correct_montgomery := fresh "m_enc_correct_montgomery" in
                   let m_enc_correct_montgomery := pose_m_enc_correct_montgomery m sz r m_enc m_enc_correct_montgomery in
                   Tag.update pkg TAG.m_enc_correct_montgomery m_enc_correct_montgomery)
    ltac:(fun _ => pkg)
    ().
Ltac add_r'_pow_correct pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r' := Tag.get pkg TAG.r' in
                   let sz := Tag.get pkg TAG.sz in
                   let r := Tag.get pkg TAG.r in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let r'_pow_correct := fresh "r'_pow_correct" in
                   let r'_pow_correct := pose_r'_pow_correct r' sz r m_enc r'_pow_correct in
                   Tag.update pkg TAG.r'_pow_correct r'_pow_correct)
    ltac:(fun _ => pkg)
    ().
Ltac add_montgomery_to_F pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let sz := Tag.get pkg TAG.sz in
                   let m := Tag.get pkg TAG.m in
                   let r' := Tag.get pkg TAG.r' in
                   let montgomery_to_F := fresh "montgomery_to_F" in
                   let montgomery_to_F := pose_montgomery_to_F sz m r' montgomery_to_F in
                   Tag.update pkg TAG.montgomery_to_F montgomery_to_F)
    ltac:(fun _ => pkg)
    ().
Ltac add_r_big pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let r_big := fresh "r_big" in
                   let r_big := pose_r_big r r_big in
                   Tag.update pkg TAG.r_big r_big)
    ltac:(fun _ => pkg)
    ().
Ltac add_m_big pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let m := Tag.get pkg TAG.m in
                   let m_big := fresh "m_big" in
                   let m_big := pose_m_big m m_big in
                   Tag.update pkg TAG.m_big m_big)
    ltac:(fun _ => pkg)
    ().
Ltac add_m_enc_small pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let sz := Tag.get pkg TAG.sz in
                   let r := Tag.get pkg TAG.r in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let m_enc_small := fresh "m_enc_small" in
                   let m_enc_small := pose_m_enc_small sz r m_enc m_enc_small in
                   Tag.update pkg TAG.m_enc_small m_enc_small)
    ltac:(fun _ => pkg)
    ().
Ltac add_map_m_enc pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let sz := Tag.get pkg TAG.sz in
                   let r := Tag.get pkg TAG.r in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let map_m_enc := fresh "map_m_enc" in
                   let map_m_enc := pose_map_m_enc sz r m_enc map_m_enc in
                   Tag.update pkg TAG.map_m_enc map_m_enc)
    ltac:(fun _ => pkg)
    ().
Ltac add_mul_ext pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m := Tag.get pkg TAG.m in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let r' := Tag.get pkg TAG.r' in
                   let r'_correct := Tag.get pkg TAG.r'_correct in
                   let m' := Tag.get pkg TAG.m' in
                   let m'_correct := Tag.get pkg TAG.m'_correct in
                   let m_enc_correct_montgomery := Tag.get pkg TAG.m_enc_correct_montgomery in
                   let r_big := Tag.get pkg TAG.r_big in
                   let m_big := Tag.get pkg TAG.m_big in
                   let m_enc_small := Tag.get pkg TAG.m_enc_small in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let mul_ext := fresh "mul_ext" in
                   let mul_ext := pose_mul_ext r sz m m_enc r' r'_correct m' m'_correct m_enc_correct_montgomery r_big m_big m_enc_small montgomery_to_F mul_ext in
                   Tag.update pkg TAG.mul_ext mul_ext)
    ltac:(fun _ => pkg)
    ().
Ltac add_add_ext pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m := Tag.get pkg TAG.m in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let r' := Tag.get pkg TAG.r' in
                   let m_enc_correct_montgomery := Tag.get pkg TAG.m_enc_correct_montgomery in
                   let r_big := Tag.get pkg TAG.r_big in
                   let m_big := Tag.get pkg TAG.m_big in
                   let m_enc_small := Tag.get pkg TAG.m_enc_small in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let add_ext := fresh "add_ext" in
                   let add_ext := pose_add_ext r sz m m_enc r' m_enc_correct_montgomery r_big m_big m_enc_small montgomery_to_F add_ext in
                   Tag.update pkg TAG.add_ext add_ext)
    ltac:(fun _ => pkg)
    ().
Ltac add_sub_ext pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m := Tag.get pkg TAG.m in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let r' := Tag.get pkg TAG.r' in
                   let m_enc_correct_montgomery := Tag.get pkg TAG.m_enc_correct_montgomery in
                   let r_big := Tag.get pkg TAG.r_big in
                   let m_enc_small := Tag.get pkg TAG.m_enc_small in
                   let map_m_enc := Tag.get pkg TAG.map_m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let sub_ext := fresh "sub_ext" in
                   let sub_ext := pose_sub_ext r sz m m_enc r' m_enc_correct_montgomery r_big m_enc_small map_m_enc montgomery_to_F sub_ext in
                   Tag.update pkg TAG.sub_ext sub_ext)
    ltac:(fun _ => pkg)
    ().
Ltac add_opp_ext pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m := Tag.get pkg TAG.m in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let r' := Tag.get pkg TAG.r' in
                   let m_enc_correct_montgomery := Tag.get pkg TAG.m_enc_correct_montgomery in
                   let r_big := Tag.get pkg TAG.r_big in
                   let m_enc_small := Tag.get pkg TAG.m_enc_small in
                   let map_m_enc := Tag.get pkg TAG.map_m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let opp_ext := fresh "opp_ext" in
                   let opp_ext := pose_opp_ext r sz m m_enc r' m_enc_correct_montgomery r_big m_enc_small map_m_enc montgomery_to_F opp_ext in
                   Tag.update pkg TAG.opp_ext opp_ext)
    ltac:(fun _ => pkg)
    ().
Ltac add_carry_ext pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m := Tag.get pkg TAG.m in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let r' := Tag.get pkg TAG.r' in
                   let r_big := Tag.get pkg TAG.r_big in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let carry_ext := fresh "carry_ext" in
                   let carry_ext := pose_carry_ext r sz m m_enc r' r_big montgomery_to_F carry_ext in
                   Tag.update pkg TAG.carry_ext carry_ext)
    ltac:(fun _ => pkg)
    ().
Ltac add_nonzero_ext pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m := Tag.get pkg TAG.m in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let r' := Tag.get pkg TAG.r' in
                   let m_enc_correct_montgomery := Tag.get pkg TAG.m_enc_correct_montgomery in
                   let r'_pow_correct := Tag.get pkg TAG.r'_pow_correct in
                   let r_big := Tag.get pkg TAG.r_big in
                   let m_big := Tag.get pkg TAG.m_big in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let nonzero_ext := fresh "nonzero_ext" in
                   let nonzero_ext := pose_nonzero_ext r sz m m_enc r' m_enc_correct_montgomery r'_pow_correct r_big m_big montgomery_to_F nonzero_ext in
                   Tag.update pkg TAG.nonzero_ext nonzero_ext)
    ltac:(fun _ => pkg)
    ().
Ltac add_mul_sig pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let mul_ext := Tag.get pkg TAG.mul_ext in
                   let mul_sig := fresh "mul_sig" in
                   let mul_sig := pose_mul_sig r sz montgomery_to_F mul_ext mul_sig in
                   Tag.update pkg TAG.mul_sig mul_sig)
    ltac:(fun _ => pkg)
    ().
Ltac add_mul_bounded pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let mul_ext := Tag.get pkg TAG.mul_ext in
                   let mul_sig := Tag.get pkg TAG.mul_sig in
                   let mul_bounded := fresh "mul_bounded" in
                   let mul_bounded := pose_mul_bounded r sz m_enc montgomery_to_F mul_ext mul_sig mul_bounded in
                   Tag.update pkg TAG.mul_bounded mul_bounded)
    ltac:(fun _ => pkg)
    ().
Ltac add_add_sig pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let add_ext := Tag.get pkg TAG.add_ext in
                   let add_sig := fresh "add_sig" in
                   let add_sig := pose_add_sig r sz m_enc montgomery_to_F add_ext add_sig in
                   Tag.update pkg TAG.add_sig add_sig)
    ltac:(fun _ => pkg)
    ().
Ltac add_add_bounded pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let add_ext := Tag.get pkg TAG.add_ext in
                   let add_sig := Tag.get pkg TAG.add_sig in
                   let add_bounded := fresh "add_bounded" in
                   let add_bounded := pose_add_bounded r sz m_enc montgomery_to_F add_ext add_sig add_bounded in
                   Tag.update pkg TAG.add_bounded add_bounded)
    ltac:(fun _ => pkg)
    ().
Ltac add_sub_sig pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let sub_ext := Tag.get pkg TAG.sub_ext in
                   let sub_sig := fresh "sub_sig" in
                   let sub_sig := pose_sub_sig r sz m_enc montgomery_to_F sub_ext sub_sig in
                   Tag.update pkg TAG.sub_sig sub_sig)
    ltac:(fun _ => pkg)
    ().
Ltac add_sub_bounded pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let sub_ext := Tag.get pkg TAG.sub_ext in
                   let sub_sig := Tag.get pkg TAG.sub_sig in
                   let sub_bounded := fresh "sub_bounded" in
                   let sub_bounded := pose_sub_bounded r sz m_enc montgomery_to_F sub_ext sub_sig sub_bounded in
                   Tag.update pkg TAG.sub_bounded sub_bounded)
    ltac:(fun _ => pkg)
    ().
Ltac add_opp_sig pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let opp_ext := Tag.get pkg TAG.opp_ext in
                   let opp_sig := fresh "opp_sig" in
                   let opp_sig := pose_opp_sig r sz m_enc montgomery_to_F opp_ext opp_sig in
                   Tag.update pkg TAG.opp_sig opp_sig)
    ltac:(fun _ => pkg)
    ().
Ltac add_opp_bounded pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let opp_ext := Tag.get pkg TAG.opp_ext in
                   let opp_sig := Tag.get pkg TAG.opp_sig in
                   let opp_bounded := fresh "opp_bounded" in
                   let opp_bounded := pose_opp_bounded r sz m_enc montgomery_to_F opp_ext opp_sig opp_bounded in
                   Tag.update pkg TAG.opp_bounded opp_bounded)
    ltac:(fun _ => pkg)
    ().
Ltac add_carry_sig pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let carry_ext := Tag.get pkg TAG.carry_ext in
                   let carry_sig := fresh "carry_sig" in
                   let carry_sig := pose_carry_sig r sz m_enc montgomery_to_F carry_ext carry_sig in
                   Tag.update pkg TAG.carry_sig carry_sig)
    ltac:(fun _ => pkg)
    ().
Ltac add_carry_bounded pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let carry_ext := Tag.get pkg TAG.carry_ext in
                   let carry_sig := Tag.get pkg TAG.carry_sig in
                   let carry_bounded := fresh "carry_bounded" in
                   let carry_bounded := pose_carry_bounded r sz m_enc montgomery_to_F carry_ext carry_sig carry_bounded in
                   Tag.update pkg TAG.carry_bounded carry_bounded)
    ltac:(fun _ => pkg)
    ().
Ltac add_nonzero_sig pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let r := Tag.get pkg TAG.r in
                   let sz := Tag.get pkg TAG.sz in
                   let m := Tag.get pkg TAG.m in
                   let m_enc := Tag.get pkg TAG.m_enc in
                   let montgomery_to_F := Tag.get pkg TAG.montgomery_to_F in
                   let nonzero_ext := Tag.get pkg TAG.nonzero_ext in
                   let nonzero_sig := fresh "nonzero_sig" in
                   let nonzero_sig := pose_nonzero_sig r sz m m_enc montgomery_to_F nonzero_ext nonzero_sig in
                   Tag.update pkg TAG.nonzero_sig nonzero_sig)
    ltac:(fun _ => pkg)
    ().
Ltac add_ring pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let ring := fresh "ring" in
                   let ring := pose_ring ring in
                   Tag.update pkg TAG.ring ring)
    ltac:(fun _ => pkg)
    ().
Ltac add_freeze_sig pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let freeze_sig := fresh "freeze_sig" in
                   let freeze_sig := pose_freeze_sig freeze_sig in
                   Tag.update pkg TAG.freeze_sig freeze_sig)
    ltac:(fun _ => pkg)
    ().
Ltac add_Mxzladderstep_sig pkg :=
  if_montgomery
    pkg
    ltac:(fun _ => let Mxzladderstep_sig := fresh "Mxzladderstep_sig" in
                   let Mxzladderstep_sig := pose_Mxzladderstep_sig Mxzladderstep_sig in
                   Tag.update pkg TAG.Mxzladderstep_sig Mxzladderstep_sig)
    ltac:(fun _ => pkg)
    ().
Ltac add_Montgomery_package pkg :=
  let pkg := add_m' pkg in
  let pkg := add_r' pkg in
  let pkg := add_m'_correct pkg in
  let pkg := add_r'_correct pkg in
  let pkg := add_m_enc_correct_montgomery pkg in
  let pkg := add_r'_pow_correct pkg in
  let pkg := add_montgomery_to_F pkg in
  let pkg := add_r_big pkg in
  let pkg := add_m_big pkg in
  let pkg := add_m_enc_small pkg in
  let pkg := add_map_m_enc pkg in
  let pkg := add_mul_ext pkg in
  let pkg := add_add_ext pkg in
  let pkg := add_sub_ext pkg in
  let pkg := add_opp_ext pkg in
  let pkg := add_carry_ext pkg in
  let pkg := add_nonzero_ext pkg in
  let pkg := add_mul_sig pkg in
  let pkg := add_mul_bounded pkg in
  let pkg := add_add_sig pkg in
  let pkg := add_add_bounded pkg in
  let pkg := add_sub_sig pkg in
  let pkg := add_sub_bounded pkg in
  let pkg := add_opp_sig pkg in
  let pkg := add_opp_bounded pkg in
  let pkg := add_carry_sig pkg in
  let pkg := add_carry_bounded pkg in
  let pkg := add_nonzero_sig pkg in
  let pkg := add_ring pkg in
  let pkg := add_freeze_sig pkg in
  let pkg := add_Mxzladderstep_sig pkg in
  Tag.strip_subst_local pkg.


Module MakeMontgomeryPackage (PKG : PrePackage).
  Module Import MakeMontgomeryPackageInternal := MakePackageBase PKG.

  Ltac get_m' _ := get TAG.m'.
  Notation m' := (ltac:(let v := get_m' () in exact v)) (only parsing).
  Ltac get_r' _ := get TAG.r'.
  Notation r' := (ltac:(let v := get_r' () in exact v)) (only parsing).
  Ltac get_m'_correct _ := get TAG.m'_correct.
  Notation m'_correct := (ltac:(let v := get_m'_correct () in exact v)) (only parsing).
  Ltac get_r'_correct _ := get TAG.r'_correct.
  Notation r'_correct := (ltac:(let v := get_r'_correct () in exact v)) (only parsing).
  Ltac get_m_enc_correct_montgomery _ := get TAG.m_enc_correct_montgomery.
  Notation m_enc_correct_montgomery := (ltac:(let v := get_m_enc_correct_montgomery () in exact v)) (only parsing).
  Ltac get_r'_pow_correct _ := get TAG.r'_pow_correct.
  Notation r'_pow_correct := (ltac:(let v := get_r'_pow_correct () in exact v)) (only parsing).
  Ltac get_montgomery_to_F _ := get TAG.montgomery_to_F.
  Notation montgomery_to_F := (ltac:(let v := get_montgomery_to_F () in exact v)) (only parsing).
  Ltac get_r_big _ := get TAG.r_big.
  Notation r_big := (ltac:(let v := get_r_big () in exact v)) (only parsing).
  Ltac get_m_big _ := get TAG.m_big.
  Notation m_big := (ltac:(let v := get_m_big () in exact v)) (only parsing).
  Ltac get_m_enc_small _ := get TAG.m_enc_small.
  Notation m_enc_small := (ltac:(let v := get_m_enc_small () in exact v)) (only parsing).
  Ltac get_map_m_enc _ := get TAG.map_m_enc.
  Notation map_m_enc := (ltac:(let v := get_map_m_enc () in exact v)) (only parsing).
  Ltac get_mul_ext _ := get TAG.mul_ext.
  Notation mul_ext := (ltac:(let v := get_mul_ext () in exact v)) (only parsing).
  Ltac get_add_ext _ := get TAG.add_ext.
  Notation add_ext := (ltac:(let v := get_add_ext () in exact v)) (only parsing).
  Ltac get_sub_ext _ := get TAG.sub_ext.
  Notation sub_ext := (ltac:(let v := get_sub_ext () in exact v)) (only parsing).
  Ltac get_opp_ext _ := get TAG.opp_ext.
  Notation opp_ext := (ltac:(let v := get_opp_ext () in exact v)) (only parsing).
  Ltac get_carry_ext _ := get TAG.carry_ext.
  Notation carry_ext := (ltac:(let v := get_carry_ext () in exact v)) (only parsing).
  Ltac get_nonzero_ext _ := get TAG.nonzero_ext.
  Notation nonzero_ext := (ltac:(let v := get_nonzero_ext () in exact v)) (only parsing).
  Ltac get_mul_bounded _ := get TAG.mul_bounded.
  Notation mul_bounded := (ltac:(let v := get_mul_bounded () in exact v)) (only parsing).
  Ltac get_add_bounded _ := get TAG.add_bounded.
  Notation add_bounded := (ltac:(let v := get_add_bounded () in exact v)) (only parsing).
  Ltac get_sub_bounded _ := get TAG.sub_bounded.
  Notation sub_bounded := (ltac:(let v := get_sub_bounded () in exact v)) (only parsing).
  Ltac get_opp_bounded _ := get TAG.opp_bounded.
  Notation opp_bounded := (ltac:(let v := get_opp_bounded () in exact v)) (only parsing).
  Ltac get_carry_bounded _ := get TAG.carry_bounded.
  Notation carry_bounded := (ltac:(let v := get_carry_bounded () in exact v)) (only parsing).
  Ltac get_nonzero_sig _ := get TAG.nonzero_sig.
  Notation nonzero_sig := (ltac:(let v := get_nonzero_sig () in exact v)) (only parsing).
End MakeMontgomeryPackage.