concrete-core 0.1.6

Concrete is a fully homomorphic encryption (FHE) library that implements Zama's variant of TFHE.
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
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
use super::Tensor;

macro_rules! save_load_unsigned {
    ($T:ty, $name: ident) => {
        mod $name {
            use super::super::Tensor;
            use crate::math::random;
            use rand;

            #[test]
            fn test_save_load() {
                let tensor_in: Tensor<_> = random::random_uniform_tensor::<$T>(10_000);
                let path = format!("/tmp/{}", rand::random::<usize>());
                tensor_in.save_to_file(&path).unwrap();
                println!("saved");
                let tensor_out: Tensor<Vec<$T>> = Tensor::load_from_file(&path).unwrap();
                // test
                assert_eq!(tensor_in, tensor_out);
            }
        }
    };
}

save_load_unsigned!(u8, tests_u8);

save_load_unsigned!(u16, tests_u16);
save_load_unsigned!(u32, tests_u32);
save_load_unsigned!(u64, tests_u64);
save_load_unsigned!(u128, tests_u128);

#[test]
fn test_add_u32() {
    let t_1 = Tensor::from_container(vec![
        2_614_422_625 as u32,
        1_347_010_255 as u32,
        1_755_118_555 as u32,
        3_348_067_670 as u32,
        3_896_589_259 as u32,
        97_617_327 as u32,
        1_545_053_739 as u32,
        1_211_085_433 as u32,
        2_684_538_667 as u32,
        202_832_626 as u32,
        1_638_508_087 as u32,
        879_523_200 as u32,
        2_456_511_176 as u32,
        2_648_745_580 as u32,
        967_205_272 as u32,
        54_854_762 as u32,
        2_609_115_771 as u32,
        1_725_392_344 as u32,
        2_314_671_715 as u32,
        1_840_995_902 as u32,
        4_041_278_880 as u32,
        275_079_767 as u32,
        2_300_142_423 as u32,
        2_333_095_686 as u32,
        3_026_580_357 as u32,
        21_931_374 as u32,
        372_535_067 as u32,
        6_439_834 as u32,
        762_787_515 as u32,
        2_734_668_397 as u32,
        3_013_991_526 as u32,
        579_324_780 as u32,
        916_175_967 as u32,
        850_321_436 as u32,
        978_826_112 as u32,
        1_360_938_704 as u32,
        2_363_410_736 as u32,
        353_572_296 as u32,
        2_196_029_604 as u32,
        1_676_698_573 as u32,
        71_702_920 as u32,
        433_353_586 as u32,
        3_336_662_792 as u32,
        3_815_644_954 as u32,
        2_974_299_797 as u32,
        1_990_548_820 as u32,
        1_683_843_869 as u32,
        2_152_628_932 as u32,
        3_625_450_751 as u32,
        2_366_853_676 as u32,
        1_798_342_904 as u32,
        2_869_368_979 as u32,
        1_185_695_639 as u32,
        3_173_469_147 as u32,
        1_531_916_725 as u32,
        3_326_214_024 as u32,
        2_067_990_523 as u32,
        976_120_805 as u32,
        3_535_693_006 as u32,
        4_223_913_473 as u32,
        2_143_410_133 as u32,
        187_637_181 as u32,
        2_370_649_336 as u32,
        3_155_284_399 as u32,
        3_282_898_811 as u32,
        3_068_767_567 as u32,
        3_033_732_496 as u32,
        3_278_852_653 as u32,
        1_988_815_405 as u32,
        3_318_268_258 as u32,
        402_934_292 as u32,
        3_162_645_643 as u32,
        2_103_209_800 as u32,
        4_253_170_701 as u32,
        2_489_673_789 as u32,
        2_224_135_091 as u32,
        1_848_398_457 as u32,
        3_159_326_514 as u32,
        3_865_725_686 as u32,
        674_027_046 as u32,
        3_191_092_214 as u32,
        356_413_912 as u32,
        682_734_067 as u32,
        2_368_555_344 as u32,
        614_314_161 as u32,
        3_515_266_737 as u32,
        949_414_245 as u32,
        2_046_032_417 as u32,
        1_495_462_201 as u32,
        2_307_315_576 as u32,
        1_960_455_472 as u32,
        917_911_666 as u32,
        1_518_075_072 as u32,
        2_925_772_427 as u32,
        298_590_050 as u32,
        1_441_972_928 as u32,
        666_987_301 as u32,
        2_167_997_170 as u32,
        3_413_359_382 as u32,
        3_526_531_810 as u32,
    ]);
    let t_2 = Tensor::from_container(vec![
        3_428_858_567 as u32,
        827_447_270 as u32,
        959_110_479 as u32,
        4_184_350_429 as u32,
        1_820_415_259 as u32,
        2_322_099_741 as u32,
        1_328_906_591 as u32,
        1_664_312_159 as u32,
        549_610_931 as u32,
        2_945_591_302 as u32,
        295_342_634 as u32,
        1_589_486_080 as u32,
        1_359_822_125 as u32,
        1_285_568_394 as u32,
        1_881_925_871 as u32,
        3_058_045_327 as u32,
        1_773_709_235 as u32,
        3_813_730_789 as u32,
        823_940_101 as u32,
        2_480_100_080 as u32,
        3_639_129_118 as u32,
        759_351_495 as u32,
        1_301_750_125 as u32,
        1_054_832_776 as u32,
        3_245_556_275 as u32,
        2_800_997_186 as u32,
        1_256_287_364 as u32,
        2_573_603_461 as u32,
        2_328_221_582 as u32,
        1_633_069_253 as u32,
        102_853_950 as u32,
        2_716_685_335 as u32,
        503_267_884 as u32,
        2_202_048_416 as u32,
        1_602_161_938 as u32,
        1_927_466_558 as u32,
        858_392_614 as u32,
        956_183_465 as u32,
        4_135_389_917 as u32,
        951_071_347 as u32,
        2_318_567_902 as u32,
        2_004_258_446 as u32,
        1_797_038_763 as u32,
        1_610_761_714 as u32,
        3_236_519_313 as u32,
        316_586_765 as u32,
        307_967_731 as u32,
        3_588_485_359 as u32,
        1_947_118_682 as u32,
        2_002_927_095 as u32,
        1_136_304_281 as u32,
        1_065_157_362 as u32,
        3_714_003_080 as u32,
        786_946_775 as u32,
        2_441_787_699 as u32,
        832_944_437 as u32,
        3_651_539_633 as u32,
        798_050_864 as u32,
        669_130_367 as u32,
        2_000_552_570 as u32,
        2_700_875_050 as u32,
        1_118_200_520 as u32,
        708_688_839 as u32,
        3_463_285_323 as u32,
        2_270_978_169 as u32,
        237_144_352 as u32,
        660_096_080 as u32,
        4_230_221_095 as u32,
        3_280_398_471 as u32,
        3_354_541_293 as u32,
        833_549_915 as u32,
        1_136_697_343 as u32,
        1_096_316_847 as u32,
        2_476_951_406 as u32,
        3_971_141_200 as u32,
        12_788_335 as u32,
        1_580_197_299 as u32,
        2_444_226_867 as u32,
        387_836_375 as u32,
        4_067_693_575 as u32,
        3_918_490_972 as u32,
        3_704_639_326 as u32,
        664_901_677 as u32,
        1_847_150_125 as u32,
        476_514_752 as u32,
        466_866_141 as u32,
        704_667_620 as u32,
        2_652_242_441 as u32,
        3_683_680_188 as u32,
        2_589_696_574 as u32,
        571_587_908 as u32,
        953_792_331 as u32,
        3_677_654_843 as u32,
        2_056_915_677 as u32,
        3_272_850_239 as u32,
        1_669_788_385 as u32,
        2_311_731_086 as u32,
        162_748_026 as u32,
        907_347_406 as u32,
        2_760_784_143 as u32,
    ]);
    let ground_truth_t_3 = Tensor::from_container(vec![
        1_748_313_896 as u32,
        2_174_457_525 as u32,
        2_714_229_034 as u32,
        3_237_450_803 as u32,
        1_422_037_222 as u32,
        2_419_717_068 as u32,
        2_873_960_330 as u32,
        2_875_397_592 as u32,
        3_234_149_598 as u32,
        3_148_423_928 as u32,
        1_933_850_721 as u32,
        2_469_009_280 as u32,
        3_816_333_301 as u32,
        3_934_313_974 as u32,
        2_849_131_143 as u32,
        3_112_900_089 as u32,
        87_857_710 as u32,
        1_244_155_837 as u32,
        3_138_611_816 as u32,
        26_128_686 as u32,
        3_385_440_702 as u32,
        1_034_431_262 as u32,
        3_601_892_548 as u32,
        3_387_928_462 as u32,
        1_977_169_336 as u32,
        2_822_928_560 as u32,
        1_628_822_431 as u32,
        2_580_043_295 as u32,
        3_091_009_097 as u32,
        72_770_354 as u32,
        3_116_845_476 as u32,
        3_296_010_115 as u32,
        1_419_443_851 as u32,
        3_052_369_852 as u32,
        2_580_988_050 as u32,
        3_288_405_262 as u32,
        3_221_803_350 as u32,
        1_309_755_761 as u32,
        2_036_452_225 as u32,
        2_627_769_920 as u32,
        2_390_270_822 as u32,
        2_437_612_032 as u32,
        838_734_259 as u32,
        1_131_439_372 as u32,
        1_915_851_814 as u32,
        2_307_135_585 as u32,
        1_991_811_600 as u32,
        1_446_146_995 as u32,
        1_277_602_137 as u32,
        74_813_475 as u32,
        2_934_647_185 as u32,
        3_934_526_341 as u32,
        604_731_423 as u32,
        3_960_415_922 as u32,
        3_973_704_424 as u32,
        4_159_158_461 as u32,
        1_424_562_860 as u32,
        1_774_171_669 as u32,
        4_204_823_373 as u32,
        1_929_498_747 as u32,
        549_317_887 as u32,
        1_305_837_701 as u32,
        3_079_338_175 as u32,
        2_323_602_426 as u32,
        1_258_909_684 as u32,
        3_305_911_919 as u32,
        3_693_828_576 as u32,
        3_214_106_452 as u32,
        974_246_580 as u32,
        2_377_842_255 as u32,
        1_236_484_207 as u32,
        4_375_690 as u32,
        3_199_526_647 as u32,
        2_435_154_811 as u32,
        2_165_847_693 as u32,
        2_236_923_426 as u32,
        3_428_595_756 as u32,
        1_308_586_085 as u32,
        4_253_562_061 as u32,
        446_753_325 as u32,
        2_814_615_890 as u32,
        4_061_053_238 as u32,
        1_347_635_744 as u32,
        4_215_705_469 as u32,
        1_090_828_913 as u32,
        3_982_132_878 as u32,
        1_654_081_865 as u32,
        403_307_562 as u32,
        884_175_093 as u32,
        602_044_854 as u32,
        2_532_043_380 as u32,
        1_871_703_997 as u32,
        900_762_619 as u32,
        687_720_808 as u32,
        3_571_440_289 as u32,
        3_111_761_313 as u32,
        2_978_718_387 as u32,
        2_330_745_196 as u32,
        25_739_492 as u32,
        1_992_348_657 as u32,
    ]);
    let mut t_3 = Tensor::allocate(0 as u32, 100);
    t_3.fill_with_wrapping_add(&t_1, &t_2);

    assert_eq!(t_3, ground_truth_t_3, "we are testing addition");
}

#[test]
fn test_sub_u64() {
    let t_1 = Tensor::from_container(vec![
        5_682_232_049_849_203_449 as u64,
        1_744_272_140_419_931_610 as u64,
        6_524_694_120_235_710_248 as u64,
        501_685_223_587_207_708 as u64,
        7_454_825_121_449_404_861 as u64,
        1_452_049_147_138_516_728 as u64,
        3_744_089_800_795_951_655 as u64,
        2_900_714_251_440_266_072 as u64,
        2_885_003_742_441_599_873 as u64,
        5_127_037_330_303_939_263 as u64,
        3_942_793_256_559_402_137 as u64,
        2_938_215_163_794_025_597 as u64,
        3_194_270_088_293_124_907 as u64,
        3_798_617_854_173_374_109 as u64,
        2_281_550_512_455_919_685 as u64,
        1_378_021_925_594_404_903 as u64,
        6_273_819_789_066_539_195 as u64,
        5_891_518_315_759_560_031 as u64,
        6_569_862_020_994_290_872 as u64,
        2_312_304_860_409_402_175 as u64,
        3_768_205_285_282_560_447 as u64,
        2_813_718_090_332_844_130 as u64,
        4_741_992_406_149_366_296 as u64,
        2_862_912_615_999_044_257 as u64,
        2_711_698_756_636_236_379 as u64,
        3_105_025_607_153_753_493 as u64,
        3_280_659_296_609_069_569 as u64,
        1_621_356_564_053_932_659 as u64,
        244_394_454_277_671_115 as u64,
        1_370_168_407_221_172_838 as u64,
        384_807_778_723_441_456 as u64,
        5_421_384_837_838_501_695 as u64,
        3_524_866_043_795_281_573 as u64,
        273_224_951_302_481_390 as u64,
        8_874_399_707_947_016_287 as u64,
        5_042_853_686_974_107_712 as u64,
        8_593_762_746_401_730_055 as u64,
        4_298_169_213_116_104_086 as u64,
        1_043_682_735_183_771_811 as u64,
        8_271_963_865_357_943_237 as u64,
        2_866_933_850_832_375_526 as u64,
        3_680_273_731_625_120_587 as u64,
        5_594_513_115_859_518_166 as u64,
        1_643_917_283_539_244_290 as u64,
        3_172_178_086_476_235_900 as u64,
        6_964_486_530_272_725_036 as u64,
        6_025_940_910_517_479_800 as u64,
        8_277_718_434_101_601_483 as u64,
        8_184_281_612_310_786_511 as u64,
        5_373_031_274_997_880_981 as u64,
        443_782_149_988_086_463 as u64,
        9_185_207_564_855_550_126 as u64,
        3_175_405_486_723_930_612 as u64,
        538_795_803_601_238_624 as u64,
        1_842_522_998_755_997_387 as u64,
        756_815_213_533_913_513 as u64,
        4_792_029_986_473_993_888 as u64,
        4_782_811_555_589_976_751 as u64,
        4_765_160_184_182_081_015 as u64,
        6_870_421_860_884_204_987 as u64,
        6_644_609_928_302_751_438 as u64,
        9_205_665_417_060_638_521 as u64,
        4_422_362_498_965_857_329 as u64,
        3_911_541_231_075_340_397 as u64,
        714_780_100_332_094_572 as u64,
        854_285_349_422_025_761 as u64,
        7_998_144_870_496_815_069 as u64,
        4_601_820_771_957_226_501 as u64,
        4_668_015_978_555_069_529 as u64,
        3_107_134_174_330_286_017 as u64,
        8_556_643_770_851_938_756 as u64,
        7_603_022_701_719_395_789 as u64,
        9_061_759_085_783_731_100 as u64,
        335_871_293_124_179_717 as u64,
        578_609_166_965_025_587 as u64,
        8_344_077_009_920_132_885 as u64,
        5_890_072_533_484_701_885 as u64,
        4_572_233_892_255_728_435 as u64,
        6_510_971_065_603_537_789 as u64,
        2_119_489_420_934_143_588 as u64,
        7_384_712_968_731_389_043 as u64,
        5_631_603_782_423_650_945 as u64,
        2_426_176_736_130_500_836 as u64,
        8_725_885_473_278_349_136 as u64,
        6_998_312_559_885_650_695 as u64,
        1_747_649_994_418_612_192 as u64,
        5_557_047_201_979_978_882 as u64,
        4_330_564_741_999_955_015 as u64,
        1_423_746_095_735_226_283 as u64,
        6_729_353_041_636_611_170 as u64,
        3_912_555_288_358_270_774 as u64,
        6_236_800_801_119_694_988 as u64,
        1_119_102_165_244_657_550 as u64,
        5_444_700_680_136_175_568 as u64,
        6_107_520_479_033_799_392 as u64,
        6_092_621_673_178_322_094 as u64,
        2_613_801_610_897_795_471 as u64,
        7_958_414_627_268_864_059 as u64,
        1_701_360_089_741_291_949 as u64,
        8_900_744_252_335_003_997 as u64,
    ]);
    let t_2 = Tensor::from_container(vec![
        8_256_890_089_369_290_096 as u64,
        6_729_858_587_364_974_993 as u64,
        7_847_985_733_087_156_225 as u64,
        4_256_288_592_723_368_540 as u64,
        1_794_053_349_452_132_041 as u64,
        6_010_968_597_662_138_399 as u64,
        6_274_700_101_275_637_475 as u64,
        3_672_569_542_766_325_569 as u64,
        7_783_627_030_003_669_629 as u64,
        249_357_646_255_069_879 as u64,
        5_557_476_119_820_039_974 as u64,
        8_042_948_614_404_456_368 as u64,
        4_654_915_497_230_252_172 as u64,
        7_722_972_477_579_752_886 as u64,
        258_964_119_735_943_544 as u64,
        3_661_700_972_414_689_603 as u64,
        5_780_010_438_965_763_305 as u64,
        5_399_007_971_131_851_993 as u64,
        9_009_523_661_328_089_448 as u64,
        670_837_492_260_568_551 as u64,
        8_553_265_509_497_774_774 as u64,
        475_007_578_406_922_623 as u64,
        1_656_958_878_392_217_405 as u64,
        3_145_284_643_778_286_187 as u64,
        6_211_468_814_998_169_736 as u64,
        7_898_586_816_448_146_424 as u64,
        6_385_644_578_140_856_445 as u64,
        6_278_113_144_098_235_027 as u64,
        5_508_031_993_944_422_488 as u64,
        2_541_351_454_611_805_754 as u64,
        253_476_817_899_518_218 as u64,
        4_042_272_828_677_076_320 as u64,
        6_273_812_701_503_178_622 as u64,
        7_154_361_991_326_158_245 as u64,
        4_812_968_649_666_322_424 as u64,
        8_058_877_626_669_330_796 as u64,
        2_570_559_734_648_418_432 as u64,
        3_260_085_933_573_705_643 as u64,
        1_282_517_144_950_793_850 as u64,
        1_370_863_113_856_127_345 as u64,
        7_751_961_484_782_528_551 as u64,
        2_576_515_167_053_557_195 as u64,
        6_023_795_786_532_458_230 as u64,
        6_726_030_942_349_870_732 as u64,
        7_466_418_281_703_253_736 as u64,
        8_567_435_608_821_064_654 as u64,
        1_678_961_003_340_349_987 as u64,
        3_502_334_064_042_353_274 as u64,
        3_731_187_845_427_012_882 as u64,
        5_317_359_253_712_576_816 as u64,
        6_534_183_265_395_520_755 as u64,
        3_251_278_594_118_653_876 as u64,
        8_455_470_979_973_987_894 as u64,
        1_134_450_355_974_787_411 as u64,
        2_087_289_461_344_972_800 as u64,
        898_091_164_345_629_933 as u64,
        1_383_688_945_649_969_441 as u64,
        6_412_373_125_771_730_589 as u64,
        3_137_727_871_406_467_282 as u64,
        2_531_450_854_507_130_283 as u64,
        8_942_523_860_499_484_955 as u64,
        3_053_185_116_942_316_003 as u64,
        7_573_298_098_522_728_453 as u64,
        7_850_035_594_752_589_513 as u64,
        7_609_365_690_458_693_792 as u64,
        3_979_440_714_450_645_544 as u64,
        8_679_308_680_362_097_737 as u64,
        3_937_728_290_719_953_722 as u64,
        3_848_494_478_551_479_774 as u64,
        3_384_383_891_744_980_023 as u64,
        7_516_977_367_724_693_326 as u64,
        435_538_850_065_011_084 as u64,
        2_232_114_847_229_197_016 as u64,
        8_939_199_010_658_684_319 as u64,
        2_450_683_567_053_287_115 as u64,
        7_734_458_772_215_536_274 as u64,
        8_218_782_583_431_213_252 as u64,
        8_553_066_689_779_351_731 as u64,
        3_832_186_301_178_121_773 as u64,
        6_381_512_211_621_916_311 as u64,
        1_300_796_182_487_056_551 as u64,
        8_878_587_019_650_156_826 as u64,
        8_211_502_017_418_832_896 as u64,
        8_604_481_095_678_650_971 as u64,
        5_587_624_902_285_300_211 as u64,
        3_426_416_825_207_801_687 as u64,
        6_489_160_959_956_510_743 as u64,
        7_128_903_513_419_063_730 as u64,
        4_040_914_739_727_604_681 as u64,
        2_688_309_576_123_447_655 as u64,
        6_492_809_116_044_763_762 as u64,
        7_116_289_826_504_895_799 as u64,
        3_531_910_189_811_123_524 as u64,
        789_365_259_912_898_159 as u64,
        6_469_517_349_990_767_948 as u64,
        1_189_741_323_354_180_502 as u64,
        1_445_291_182_187_601_512 as u64,
        8_147_987_973_554_022_701 as u64,
        2_888_875_140_678_677_703 as u64,
        7_057_288_198_514_267_233 as u64,
    ]);
    let ground_truth_t_3 = Tensor::from_container(vec![
        15_872_086_034_189_464_969 as u64,
        13_461_157_626_764_508_233 as u64,
        17_123_452_460_858_105_639 as u64,
        14_692_140_704_573_390_784 as u64,
        5_660_771_771_997_272_820 as u64,
        13_887_824_623_185_929_945 as u64,
        15_916_133_773_229_865_796 as u64,
        17_674_888_782_383_492_119 as u64,
        13_548_120_786_147_481_860 as u64,
        4_877_679_684_048_869_384 as u64,
        16_832_061_210_448_913_779 as u64,
        13_342_010_623_099_120_845 as u64,
        16_986_098_664_772_424_351 as u64,
        14_522_389_450_303_172_839 as u64,
        2_022_586_392_719_976_141 as u64,
        16_163_065_026_889_266_916 as u64,
        493_809_350_100_775_890 as u64,
        492_510_344_627_708_038 as u64,
        16_007_082_433_375_753_040 as u64,
        1_641_467_368_148_833_624 as u64,
        13_661_683_849_494_337_289 as u64,
        2_338_710_511_925_921_507 as u64,
        3_085_033_527_757_148_891 as u64,
        18_164_372_045_930_309_686 as u64,
        14_946_974_015_347_618_259 as u64,
        13_653_182_864_415_158_685 as u64,
        15_341_758_792_177_764_740 as u64,
        13_789_987_493_665_249_248 as u64,
        13_183_106_534_042_800_243 as u64,
        17_275_561_026_318_918_700 as u64,
        131_330_960_823_923_238 as u64,
        1_379_112_009_161_425_375 as u64,
        15_697_797_416_001_654_567 as u64,
        11_565_607_033_685_874_761 as u64,
        4_061_431_058_280_693_863 as u64,
        15_430_720_134_014_328_532 as u64,
        6_023_203_011_753_311_623 as u64,
        1_038_083_279_542_398_443 as u64,
        18_207_909_663_942_529_577 as u64,
        6_901_100_751_501_815_892 as u64,
        13_561_716_439_759_398_591 as u64,
        1_103_758_564_571_563_392 as u64,
        18_017_461_403_036_611_552 as u64,
        13_364_630_414_898_925_174 as u64,
        14_152_503_878_482_533_780 as u64,
        16_843_794_995_161_211_998 as u64,
        4_346_979_907_177_129_813 as u64,
        4_775_384_370_059_248_209 as u64,
        4_453_093_766_883_773_629 as u64,
        55_672_021_285_304_165 as u64,
        12_356_342_958_302_117_324 as u64,
        5_933_928_970_736_896_250 as u64,
        13_166_678_580_459_494_334 as u64,
        17_851_089_521_336_002_829 as u64,
        18_201_977_611_120_576_203 as u64,
        18_305_468_122_897_835_196 as u64,
        3_408_341_040_824_024_447 as u64,
        16_817_182_503_527_797_778 as u64,
        1_627_432_312_775_613_733 as u64,
        4_338_971_006_377_074_704 as u64,
        16_148_830_141_512_818_099 as u64,
        6_152_480_300_118_322_518 as u64,
        15_295_808_474_152_680_492 as u64,
        14_508_249_710_032_302_500 as u64,
        11_552_158_483_582_952_396 as u64,
        15_321_588_708_680_931_833 as u64,
        17_765_580_263_844_268_948 as u64,
        664_092_481_237_272_779 as u64,
        819_521_500_003_589_755 as u64,
        18_169_494_356_294_857_610 as u64,
        1_039_666_403_127_245_430 as u64,
        7_167_483_851_654_384_705 as u64,
        6_829_644_238_554_534_084 as u64,
        9_843_416_356_175_047_014 as u64,
        16_574_669_673_621_290_088 as u64,
        609_618_237_704_596_611 as u64,
        16_118_034_023_763_040_249 as u64,
        14_465_911_276_185_928_320 as u64,
        2_678_784_764_425_416_016 as u64,
        14_184_721_283_021_778_893 as u64,
        6_083_916_786_244_332_492 as u64,
        15_199_760_836_483_045_735 as u64,
        12_661_418_792_421_219_556 as u64,
        121_404_377_599_698_165 as u64,
        1_410_687_657_600_350_484 as u64,
        16_767_977_242_920_362_121 as u64,
        17_514_630_315_733_019_755 as u64,
        15_648_405_302_290_442_901 as u64,
        15_829_575_429_717_173_218 as u64,
        4_041_043_465_513_163_515 as u64,
        15_866_490_246_023_058_628 as u64,
        17_567_255_048_324_350_805 as u64,
        16_033_936_049_143_085_642 as u64,
        4_655_335_420_223_277_409 as u64,
        18_084_747_202_752_583_060 as u64,
        4_902_880_349_824_141_592 as u64,
        1_168_510_428_710_193_959 as u64,
        18_257_170_727_424_392_974 as u64,
        17_259_229_022_772_165_862 as u64,
        1_843_456_053_820_736_764 as u64,
    ]);
    let mut t_3 = Tensor::allocate(0 as u64, 100);
    t_3.fill_with_wrapping_sub(&t_1, &t_2);

    assert_eq!(t_3, ground_truth_t_3, "we are testing u-64 sub ");
}

#[test]
fn test_sub_u32() {
    let t_1 = Tensor::from_container(vec![
        2_614_422_625 as u32,
        1_347_010_255 as u32,
        1_755_118_555 as u32,
        3_348_067_670 as u32,
        3_896_589_259 as u32,
        97_617_327 as u32,
        1_545_053_739 as u32,
        1_211_085_433 as u32,
        2_684_538_667 as u32,
        202_832_626 as u32,
        1_638_508_087 as u32,
        879_523_200 as u32,
        2_456_511_176 as u32,
        2_648_745_580 as u32,
        967_205_272 as u32,
        54_854_762 as u32,
        2_609_115_771 as u32,
        1_725_392_344 as u32,
        2_314_671_715 as u32,
        1_840_995_902 as u32,
        4_041_278_880 as u32,
        275_079_767 as u32,
        2_300_142_423 as u32,
        2_333_095_686 as u32,
        3_026_580_357 as u32,
        21_931_374 as u32,
        372_535_067 as u32,
        6_439_834 as u32,
        762_787_515 as u32,
        2_734_668_397 as u32,
        3_013_991_526 as u32,
        579_324_780 as u32,
        916_175_967 as u32,
        850_321_436 as u32,
        978_826_112 as u32,
        1_360_938_704 as u32,
        2_363_410_736 as u32,
        353_572_296 as u32,
        2_196_029_604 as u32,
        1_676_698_573 as u32,
        71_702_920 as u32,
        433_353_586 as u32,
        3_336_662_792 as u32,
        3_815_644_954 as u32,
        2_974_299_797 as u32,
        1_990_548_820 as u32,
        1_683_843_869 as u32,
        2_152_628_932 as u32,
        3_625_450_751 as u32,
        2_366_853_676 as u32,
        1_798_342_904 as u32,
        2_869_368_979 as u32,
        1_185_695_639 as u32,
        3_173_469_147 as u32,
        1_531_916_725 as u32,
        3_326_214_024 as u32,
        2_067_990_523 as u32,
        976_120_805 as u32,
        3_535_693_006 as u32,
        4_223_913_473 as u32,
        2_143_410_133 as u32,
        187_637_181 as u32,
        2_370_649_336 as u32,
        3_155_284_399 as u32,
        3_282_898_811 as u32,
        3_068_767_567 as u32,
        3_033_732_496 as u32,
        3_278_852_653 as u32,
        1_988_815_405 as u32,
        3_318_268_258 as u32,
        402_934_292 as u32,
        3_162_645_643 as u32,
        2_103_209_800 as u32,
        4_253_170_701 as u32,
        2_489_673_789 as u32,
        2_224_135_091 as u32,
        1_848_398_457 as u32,
        3_159_326_514 as u32,
        3_865_725_686 as u32,
        674_027_046 as u32,
        3_191_092_214 as u32,
        356_413_912 as u32,
        682_734_067 as u32,
        2_368_555_344 as u32,
        614_314_161 as u32,
        3_515_266_737 as u32,
        949_414_245 as u32,
        2_046_032_417 as u32,
        1_495_462_201 as u32,
        2_307_315_576 as u32,
        1_960_455_472 as u32,
        917_911_666 as u32,
        1_518_075_072 as u32,
        2_925_772_427 as u32,
        298_590_050 as u32,
        1_441_972_928 as u32,
        666_987_301 as u32,
        2_167_997_170 as u32,
        3_413_359_382 as u32,
        3_526_531_810 as u32,
    ]);
    let t_2 = Tensor::from_container(vec![
        3_428_858_567 as u32,
        827_447_270 as u32,
        959_110_479 as u32,
        4_184_350_429 as u32,
        1_820_415_259 as u32,
        2_322_099_741 as u32,
        1_328_906_591 as u32,
        1_664_312_159 as u32,
        549_610_931 as u32,
        2_945_591_302 as u32,
        295_342_634 as u32,
        1_589_486_080 as u32,
        1_359_822_125 as u32,
        1_285_568_394 as u32,
        1_881_925_871 as u32,
        3_058_045_327 as u32,
        1_773_709_235 as u32,
        3_813_730_789 as u32,
        823_940_101 as u32,
        2_480_100_080 as u32,
        3_639_129_118 as u32,
        759_351_495 as u32,
        1_301_750_125 as u32,
        1_054_832_776 as u32,
        3_245_556_275 as u32,
        2_800_997_186 as u32,
        1_256_287_364 as u32,
        2_573_603_461 as u32,
        2_328_221_582 as u32,
        1_633_069_253 as u32,
        102_853_950 as u32,
        2_716_685_335 as u32,
        503_267_884 as u32,
        2_202_048_416 as u32,
        1_602_161_938 as u32,
        1_927_466_558 as u32,
        858_392_614 as u32,
        956_183_465 as u32,
        4_135_389_917 as u32,
        951_071_347 as u32,
        2_318_567_902 as u32,
        2_004_258_446 as u32,
        1_797_038_763 as u32,
        1_610_761_714 as u32,
        3_236_519_313 as u32,
        316_586_765 as u32,
        307_967_731 as u32,
        3_588_485_359 as u32,
        1_947_118_682 as u32,
        2_002_927_095 as u32,
        1_136_304_281 as u32,
        1_065_157_362 as u32,
        3_714_003_080 as u32,
        786_946_775 as u32,
        2_441_787_699 as u32,
        832_944_437 as u32,
        3_651_539_633 as u32,
        798_050_864 as u32,
        669_130_367 as u32,
        2_000_552_570 as u32,
        2_700_875_050 as u32,
        1_118_200_520 as u32,
        708_688_839 as u32,
        3_463_285_323 as u32,
        2_270_978_169 as u32,
        237_144_352 as u32,
        660_096_080 as u32,
        4_230_221_095 as u32,
        3_280_398_471 as u32,
        3_354_541_293 as u32,
        833_549_915 as u32,
        1_136_697_343 as u32,
        1_096_316_847 as u32,
        2_476_951_406 as u32,
        3_971_141_200 as u32,
        12_788_335 as u32,
        1_580_197_299 as u32,
        2_444_226_867 as u32,
        387_836_375 as u32,
        4_067_693_575 as u32,
        3_918_490_972 as u32,
        3_704_639_326 as u32,
        664_901_677 as u32,
        1_847_150_125 as u32,
        476_514_752 as u32,
        466_866_141 as u32,
        704_667_620 as u32,
        2_652_242_441 as u32,
        3_683_680_188 as u32,
        2_589_696_574 as u32,
        571_587_908 as u32,
        953_792_331 as u32,
        3_677_654_843 as u32,
        2_056_915_677 as u32,
        3_272_850_239 as u32,
        1_669_788_385 as u32,
        2_311_731_086 as u32,
        162_748_026 as u32,
        907_347_406 as u32,
        2_760_784_143 as u32,
    ]);
    let ground_truth_t_3 = Tensor::from_container(vec![
        3_480_531_354 as u32,
        519_562_985 as u32,
        796_008_076 as u32,
        3_458_684_537 as u32,
        2_076_174_000 as u32,
        2_070_484_882 as u32,
        216_147_148 as u32,
        3_841_740_570 as u32,
        2_134_927_736 as u32,
        1_552_208_620 as u32,
        1_343_165_453 as u32,
        3_585_004_416 as u32,
        1_096_689_051 as u32,
        1_363_177_186 as u32,
        3_380_246_697 as u32,
        1_291_776_731 as u32,
        835_406_536 as u32,
        2_206_628_851 as u32,
        1_490_731_614 as u32,
        3_655_863_118 as u32,
        402_149_762 as u32,
        3_810_695_568 as u32,
        998_392_298 as u32,
        1_278_262_910 as u32,
        4_075_991_378 as u32,
        1_515_901_484 as u32,
        3_411_214_999 as u32,
        1_727_803_669 as u32,
        2_729_533_229 as u32,
        1_101_599_144 as u32,
        2_911_137_576 as u32,
        2_157_606_741 as u32,
        412_908_083 as u32,
        2_943_240_316 as u32,
        3_671_631_470 as u32,
        3_728_439_442 as u32,
        1_505_018_122 as u32,
        3_692_356_127 as u32,
        2_355_606_983 as u32,
        725_627_226 as u32,
        2_048_102_314 as u32,
        2_724_062_436 as u32,
        1_539_624_029 as u32,
        2_204_883_240 as u32,
        4_032_747_780 as u32,
        1_673_962_055 as u32,
        1_375_876_138 as u32,
        2_859_110_869 as u32,
        1_678_332_069 as u32,
        363_926_581 as u32,
        662_038_623 as u32,
        1_804_211_617 as u32,
        1_766_659_855 as u32,
        2_386_522_372 as u32,
        3_385_096_322 as u32,
        2_493_269_587 as u32,
        2_711_418_186 as u32,
        178_069_941 as u32,
        2_866_562_639 as u32,
        2_223_360_903 as u32,
        3_737_502_379 as u32,
        3_364_403_957 as u32,
        1_661_960_497 as u32,
        3_986_966_372 as u32,
        1_011_920_642 as u32,
        2_831_623_215 as u32,
        2_373_636_416 as u32,
        3_343_598_854 as u32,
        3_003_384_230 as u32,
        4_258_694_261 as u32,
        3_864_351_673 as u32,
        2_025_948_300 as u32,
        1_006_892_953 as u32,
        1_776_219_295 as u32,
        2_813_499_885 as u32,
        2_211_346_756 as u32,
        268_201_158 as u32,
        715_099_647 as u32,
        3_477_889_311 as u32,
        901_300_767 as u32,
        3_567_568_538 as u32,
        946_741_882 as u32,
        17_832_390 as u32,
        521_405_219 as u32,
        137_799_409 as u32,
        3_048_400_596 as u32,
        244_746_625 as u32,
        3_688_757_272 as u32,
        2_106_749_309 as u32,
        4_012_586_298 as u32,
        1_388_867_564 as u32,
        4_259_086_631 as u32,
        2_135_387_525 as u32,
        868_856_750 as u32,
        1_320_707_107 as u32,
        4_067_151_839 as u32,
        2_650_223_511 as u32,
        2_005_249_144 as u32,
        2_506_011_976 as u32,
        765_747_667 as u32,
    ]);
    let mut t_3 = Tensor::allocate(0 as u32, 100);
    t_3.fill_with_wrapping_sub(&t_1, &t_2);

    assert_eq!(t_3, ground_truth_t_3, "we are testing substraction");
}

#[test]
fn test_add_u64() {
    let t_1 = Tensor::from_container(vec![
        5_682_232_049_849_203_449 as u64,
        1_744_272_140_419_931_610 as u64,
        6_524_694_120_235_710_248 as u64,
        501_685_223_587_207_708 as u64,
        7_454_825_121_449_404_861 as u64,
        1_452_049_147_138_516_728 as u64,
        3_744_089_800_795_951_655 as u64,
        2_900_714_251_440_266_072 as u64,
        2_885_003_742_441_599_873 as u64,
        5_127_037_330_303_939_263 as u64,
        3_942_793_256_559_402_137 as u64,
        2_938_215_163_794_025_597 as u64,
        3_194_270_088_293_124_907 as u64,
        3_798_617_854_173_374_109 as u64,
        2_281_550_512_455_919_685 as u64,
        1_378_021_925_594_404_903 as u64,
        6_273_819_789_066_539_195 as u64,
        5_891_518_315_759_560_031 as u64,
        6_569_862_020_994_290_872 as u64,
        2_312_304_860_409_402_175 as u64,
        3_768_205_285_282_560_447 as u64,
        2_813_718_090_332_844_130 as u64,
        4_741_992_406_149_366_296 as u64,
        2_862_912_615_999_044_257 as u64,
        2_711_698_756_636_236_379 as u64,
        3_105_025_607_153_753_493 as u64,
        3_280_659_296_609_069_569 as u64,
        1_621_356_564_053_932_659 as u64,
        244_394_454_277_671_115 as u64,
        1_370_168_407_221_172_838 as u64,
        384_807_778_723_441_456 as u64,
        5_421_384_837_838_501_695 as u64,
        3_524_866_043_795_281_573 as u64,
        273_224_951_302_481_390 as u64,
        8_874_399_707_947_016_287 as u64,
        5_042_853_686_974_107_712 as u64,
        8_593_762_746_401_730_055 as u64,
        4_298_169_213_116_104_086 as u64,
        1_043_682_735_183_771_811 as u64,
        8_271_963_865_357_943_237 as u64,
        2_866_933_850_832_375_526 as u64,
        3_680_273_731_625_120_587 as u64,
        5_594_513_115_859_518_166 as u64,
        1_643_917_283_539_244_290 as u64,
        3_172_178_086_476_235_900 as u64,
        6_964_486_530_272_725_036 as u64,
        6_025_940_910_517_479_800 as u64,
        8_277_718_434_101_601_483 as u64,
        8_184_281_612_310_786_511 as u64,
        5_373_031_274_997_880_981 as u64,
        443_782_149_988_086_463 as u64,
        9_185_207_564_855_550_126 as u64,
        3_175_405_486_723_930_612 as u64,
        538_795_803_601_238_624 as u64,
        1_842_522_998_755_997_387 as u64,
        756_815_213_533_913_513 as u64,
        4_792_029_986_473_993_888 as u64,
        4_782_811_555_589_976_751 as u64,
        4_765_160_184_182_081_015 as u64,
        6_870_421_860_884_204_987 as u64,
        6_644_609_928_302_751_438 as u64,
        9_205_665_417_060_638_521 as u64,
        4_422_362_498_965_857_329 as u64,
        3_911_541_231_075_340_397 as u64,
        714_780_100_332_094_572 as u64,
        854_285_349_422_025_761 as u64,
        7_998_144_870_496_815_069 as u64,
        4_601_820_771_957_226_501 as u64,
        4_668_015_978_555_069_529 as u64,
        3_107_134_174_330_286_017 as u64,
        8_556_643_770_851_938_756 as u64,
        7_603_022_701_719_395_789 as u64,
        9_061_759_085_783_731_100 as u64,
        335_871_293_124_179_717 as u64,
        578_609_166_965_025_587 as u64,
        8_344_077_009_920_132_885 as u64,
        5_890_072_533_484_701_885 as u64,
        4_572_233_892_255_728_435 as u64,
        6_510_971_065_603_537_789 as u64,
        2_119_489_420_934_143_588 as u64,
        7_384_712_968_731_389_043 as u64,
        5_631_603_782_423_650_945 as u64,
        2_426_176_736_130_500_836 as u64,
        8_725_885_473_278_349_136 as u64,
        6_998_312_559_885_650_695 as u64,
        1_747_649_994_418_612_192 as u64,
        5_557_047_201_979_978_882 as u64,
        4_330_564_741_999_955_015 as u64,
        1_423_746_095_735_226_283 as u64,
        6_729_353_041_636_611_170 as u64,
        3_912_555_288_358_270_774 as u64,
        6_236_800_801_119_694_988 as u64,
        1_119_102_165_244_657_550 as u64,
        5_444_700_680_136_175_568 as u64,
        6_107_520_479_033_799_392 as u64,
        6_092_621_673_178_322_094 as u64,
        2_613_801_610_897_795_471 as u64,
        7_958_414_627_268_864_059 as u64,
        1_701_360_089_741_291_949 as u64,
        8_900_744_252_335_003_997 as u64,
    ]);
    let t_2 = Tensor::from_container(vec![
        8_256_890_089_369_290_096 as u64,
        6_729_858_587_364_974_993 as u64,
        7_847_985_733_087_156_225 as u64,
        4_256_288_592_723_368_540 as u64,
        1_794_053_349_452_132_041 as u64,
        6_010_968_597_662_138_399 as u64,
        6_274_700_101_275_637_475 as u64,
        3_672_569_542_766_325_569 as u64,
        7_783_627_030_003_669_629 as u64,
        249_357_646_255_069_879 as u64,
        5_557_476_119_820_039_974 as u64,
        8_042_948_614_404_456_368 as u64,
        4_654_915_497_230_252_172 as u64,
        7_722_972_477_579_752_886 as u64,
        258_964_119_735_943_544 as u64,
        3_661_700_972_414_689_603 as u64,
        5_780_010_438_965_763_305 as u64,
        5_399_007_971_131_851_993 as u64,
        9_009_523_661_328_089_448 as u64,
        670_837_492_260_568_551 as u64,
        8_553_265_509_497_774_774 as u64,
        475_007_578_406_922_623 as u64,
        1_656_958_878_392_217_405 as u64,
        3_145_284_643_778_286_187 as u64,
        6_211_468_814_998_169_736 as u64,
        7_898_586_816_448_146_424 as u64,
        6_385_644_578_140_856_445 as u64,
        6_278_113_144_098_235_027 as u64,
        5_508_031_993_944_422_488 as u64,
        2_541_351_454_611_805_754 as u64,
        253_476_817_899_518_218 as u64,
        4_042_272_828_677_076_320 as u64,
        6_273_812_701_503_178_622 as u64,
        7_154_361_991_326_158_245 as u64,
        4_812_968_649_666_322_424 as u64,
        8_058_877_626_669_330_796 as u64,
        2_570_559_734_648_418_432 as u64,
        3_260_085_933_573_705_643 as u64,
        1_282_517_144_950_793_850 as u64,
        1_370_863_113_856_127_345 as u64,
        7_751_961_484_782_528_551 as u64,
        2_576_515_167_053_557_195 as u64,
        6_023_795_786_532_458_230 as u64,
        6_726_030_942_349_870_732 as u64,
        7_466_418_281_703_253_736 as u64,
        8_567_435_608_821_064_654 as u64,
        1_678_961_003_340_349_987 as u64,
        3_502_334_064_042_353_274 as u64,
        3_731_187_845_427_012_882 as u64,
        5_317_359_253_712_576_816 as u64,
        6_534_183_265_395_520_755 as u64,
        3_251_278_594_118_653_876 as u64,
        8_455_470_979_973_987_894 as u64,
        1_134_450_355_974_787_411 as u64,
        2_087_289_461_344_972_800 as u64,
        898_091_164_345_629_933 as u64,
        1_383_688_945_649_969_441 as u64,
        6_412_373_125_771_730_589 as u64,
        3_137_727_871_406_467_282 as u64,
        2_531_450_854_507_130_283 as u64,
        8_942_523_860_499_484_955 as u64,
        3_053_185_116_942_316_003 as u64,
        7_573_298_098_522_728_453 as u64,
        7_850_035_594_752_589_513 as u64,
        7_609_365_690_458_693_792 as u64,
        3_979_440_714_450_645_544 as u64,
        8_679_308_680_362_097_737 as u64,
        3_937_728_290_719_953_722 as u64,
        3_848_494_478_551_479_774 as u64,
        3_384_383_891_744_980_023 as u64,
        7_516_977_367_724_693_326 as u64,
        435_538_850_065_011_084 as u64,
        2_232_114_847_229_197_016 as u64,
        8_939_199_010_658_684_319 as u64,
        2_450_683_567_053_287_115 as u64,
        7_734_458_772_215_536_274 as u64,
        8_218_782_583_431_213_252 as u64,
        8_553_066_689_779_351_731 as u64,
        3_832_186_301_178_121_773 as u64,
        6_381_512_211_621_916_311 as u64,
        1_300_796_182_487_056_551 as u64,
        8_878_587_019_650_156_826 as u64,
        8_211_502_017_418_832_896 as u64,
        8_604_481_095_678_650_971 as u64,
        5_587_624_902_285_300_211 as u64,
        3_426_416_825_207_801_687 as u64,
        6_489_160_959_956_510_743 as u64,
        7_128_903_513_419_063_730 as u64,
        4_040_914_739_727_604_681 as u64,
        2_688_309_576_123_447_655 as u64,
        6_492_809_116_044_763_762 as u64,
        7_116_289_826_504_895_799 as u64,
        3_531_910_189_811_123_524 as u64,
        789_365_259_912_898_159 as u64,
        6_469_517_349_990_767_948 as u64,
        1_189_741_323_354_180_502 as u64,
        1_445_291_182_187_601_512 as u64,
        8_147_987_973_554_022_701 as u64,
        2_888_875_140_678_677_703 as u64,
        7_057_288_198_514_267_233 as u64,
    ]);
    let ground_truth_t_3 = Tensor::from_container(vec![
        13_939_122_139_218_493_545 as u64,
        8_474_130_727_784_906_603 as u64,
        14_372_679_853_322_866_473 as u64,
        4_757_973_816_310_576_248 as u64,
        9_248_878_470_901_536_902 as u64,
        7_463_017_744_800_655_127 as u64,
        10_018_789_902_071_589_130 as u64,
        6_573_283_794_206_591_641 as u64,
        10_668_630_772_445_269_502 as u64,
        5_376_394_976_559_009_142 as u64,
        9_500_269_376_379_442_111 as u64,
        10_981_163_778_198_481_965 as u64,
        7_849_185_585_523_377_079 as u64,
        11_521_590_331_753_126_995 as u64,
        2_540_514_632_191_863_229 as u64,
        5_039_722_898_009_094_506 as u64,
        12_053_830_228_032_302_500 as u64,
        11_290_526_286_891_412_024 as u64,
        15_579_385_682_322_380_320 as u64,
        2_983_142_352_669_970_726 as u64,
        12_321_470_794_780_335_221 as u64,
        3_288_725_668_739_766_753 as u64,
        6_398_951_284_541_583_701 as u64,
        6_008_197_259_777_330_444 as u64,
        8_923_167_571_634_406_115 as u64,
        11_003_612_423_601_899_917 as u64,
        9_666_303_874_749_926_014 as u64,
        7_899_469_708_152_167_686 as u64,
        5_752_426_448_222_093_603 as u64,
        3_911_519_861_832_978_592 as u64,
        638_284_596_622_959_674 as u64,
        9_463_657_666_515_578_015 as u64,
        9_798_678_745_298_460_195 as u64,
        7_427_586_942_628_639_635 as u64,
        13_687_368_357_613_338_711 as u64,
        13_101_731_313_643_438_508 as u64,
        11_164_322_481_050_148_487 as u64,
        7_558_255_146_689_809_729 as u64,
        2_326_199_880_134_565_661 as u64,
        9_642_826_979_214_070_582 as u64,
        10_618_895_335_614_904_077 as u64,
        6_256_788_898_678_677_782 as u64,
        11_618_308_902_391_976_396 as u64,
        8_369_948_225_889_115_022 as u64,
        10_638_596_368_179_489_636 as u64,
        15_531_922_139_093_789_690 as u64,
        7_704_901_913_857_829_787 as u64,
        11_780_052_498_143_954_757 as u64,
        11_915_469_457_737_799_393 as u64,
        10_690_390_528_710_457_797 as u64,
        6_977_965_415_383_607_218 as u64,
        12_436_486_158_974_204_002 as u64,
        11_630_876_466_697_918_506 as u64,
        1_673_246_159_576_026_035 as u64,
        3_929_812_460_100_970_187 as u64,
        1_654_906_377_879_543_446 as u64,
        6_175_718_932_123_963_329 as u64,
        11_195_184_681_361_707_340 as u64,
        7_902_888_055_588_548_297 as u64,
        9_401_872_715_391_335_270 as u64,
        15_587_133_788_802_236_393 as u64,
        12_258_850_534_002_954_524 as u64,
        11_995_660_597_488_585_782 as u64,
        11_761_576_825_827_929_910 as u64,
        8_324_145_790_790_788_364 as u64,
        4_833_726_063_872_671_305 as u64,
        16_677_453_550_858_912_806 as u64,
        8_539_549_062_677_180_223 as u64,
        8_516_510_457_106_549_303 as u64,
        6_491_518_066_075_266_040 as u64,
        16_073_621_138_576_632_082 as u64,
        8_038_561_551_784_406_873 as u64,
        11_293_873_933_012_928_116 as u64,
        9_275_070_303_782_864_036 as u64,
        3_029_292_734_018_312_702 as u64,
        16_078_535_782_135_669_159 as u64,
        14_108_855_116_915_915_137 as u64,
        13_125_300_582_035_080_166 as u64,
        10_343_157_366_781_659_562 as u64,
        8_501_001_632_556_059_899 as u64,
        8_685_509_151_218_445_594 as u64,
        14_510_190_802_073_807_771 as u64,
        10_637_678_753_549_333_732 as u64,
        17_330_366_568_957_000_107 as u64,
        12_585_937_462_170_950_906 as u64,
        5_174_066_819_626_413_879 as u64,
        12_046_208_161_936_489_625 as u64,
        11_459_468_255_419_018_745 as u64,
        5_464_660_835_462_830_964 as u64,
        9_417_662_617_760_058_825 as u64,
        10_405_364_404_403_034_536 as u64,
        13_353_090_627_624_590_787 as u64,
        4_651_012_355_055_781_074 as u64,
        6_234_065_940_049_073_727 as u64,
        12_577_037_829_024_567_340 as u64,
        7_282_362_996_532_502_596 as u64,
        4_059_092_793_085_396_983 as u64,
        16_106_402_600_822_886_760 as u64,
        4_590_235_230_419_969_652 as u64,
        15_958_032_450_849_271_230 as u64,
    ]);
    let mut t_3 = Tensor::allocate(0 as u64, 100);
    t_3.fill_with_wrapping_add(&t_1, &t_2);

    assert_eq!(t_3, ground_truth_t_3, "we are testing u64 add");
}