figures 0.5.0

A math library specialized for 2d screen graphics.
Documentation
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
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
use crate::Fraction;

#[cfg(test)]
#[allow(clippy::items_after_test_module)]
mod gen_and_test {
    use std::f32::consts::PI;

    use crate::tables::ARCTAN_SUBDIVISIONS;
    use crate::{Angle, Fraction};

    #[test]
    fn sine_table() {
        for i in 0..360 {
            let sin = (f32::from(i) / 180. * PI).sin();
            let fraction = Fraction::from(sin);
            if fraction.denominator() == 1 {
                println!("Fraction::new_whole({}),", fraction.numerator());
            } else {
                println!(
                    "Fraction::new_presimplified({}, {}),",
                    fraction.numerator(),
                    fraction.denominator()
                );
            }
            let angle = Angle::degrees(i);
            assert!((angle.sin().into_f32() - sin).abs() < 0.000_001);
        }
    }

    #[test]
    fn cosine_table() {
        for i in 0..360 {
            let cos = (f32::from(i) / 180. * PI).cos();
            let fraction = Fraction::from(cos);
            if fraction.denominator() == 1 {
                println!("Fraction::new_whole({}),", fraction.numerator());
            } else {
                println!(
                    "Fraction::new_presimplified({}, {}),",
                    fraction.numerator(),
                    fraction.denominator()
                );
            }
            let angle = Angle::degrees(i);
            assert!((angle.cos().into_f32() - cos).abs() < 0.000_001);
        }
    }

    #[test]
    fn tangent_table() {
        for i in 0..360 {
            let tan = (f32::from(i) / 180. * PI).tan();
            let fraction = Fraction::from(tan);
            if fraction.denominator() == 1 {
                println!("Fraction::new_whole({}),", fraction.numerator());
            } else {
                println!(
                    "Fraction::new_presimplified({}, {}),",
                    fraction.numerator(),
                    fraction.denominator()
                );
            }
            let angle = Angle::degrees(i);
            if i == 90 {
                assert_eq!(angle.tan(), Fraction::MIN);
            } else if i == 270 {
                assert_eq!(angle.tan(), Fraction::MAX);
            } else {
                assert!(
                    (angle.tan().into_f32() - tan).abs() < 0.0001,
                    "{} ({}) != {}",
                    angle.tan(),
                    angle.tan().into_f32(),
                    tan
                );
            }
        }
    }

    #[test]
    fn arctan_table() {
        for i in 0..=ARCTAN_SUBDIVISIONS {
            let tan = (f32::from(i) / f32::from(ARCTAN_SUBDIVISIONS)).atan();
            let fraction = Fraction::from(tan);
            if fraction.denominator() == 1 {
                println!("Fraction::new_whole({}),", fraction.numerator());
            } else {
                println!(
                    "Fraction::new_presimplified({}, {}),",
                    fraction.numerator(),
                    fraction.denominator()
                );
            }
            // let angle = Angle::degrees(i);
            // if i == 90 {
            //     assert_eq!(angle.tan(), Fraction::MIN);
            // } else if i == 270 {
            //     assert_eq!(angle.tan(), Fraction::MAX);
            // } else {
            //     assert!(
            //         (angle.tan().into_f32() - tan).abs() < 0.0001,
            //         "{} ({}) != {}",
            //         angle.tan(),
            //         angle.tan().into_f32(),
            //         tan
            //     );
            // }
        }
    }
}

pub const ARCTAN_SUBDIVISIONS: i16 = 2 * 3 * 7 * 11;
#[allow(clippy::cast_sign_loss)] // We are only doing this when looking up into the table.
#[allow(clippy::cast_possible_wrap, clippy::cast_possible_truncation)] // None of the tables are large enough to cause issues with usize.
pub fn approximate_via_lookup_table<const N: usize>(
    fraction: Fraction,
    table: &[Fraction; N],
) -> Fraction {
    const fn next_degree(degree: i16, count: usize) -> i16 {
        if degree < count as i16 - 1 {
            degree + 1
        } else {
            0
        }
    }

    const fn previous_degree(degree: i16, count: usize) -> i16 {
        if degree > 0 {
            degree - 1
        } else {
            count as i16 - 1
        }
    }

    let (mut whole, mut fraction) = fraction.round_with_amount();
    debug_assert!(!whole.is_negative());
    if whole as usize > N - 1 {
        whole = 0;
    }
    let approximate = table[whole as usize];
    if fraction.is_zero() {
        approximate
    } else {
        let next = if fraction.is_negative() {
            fraction = -fraction;
            previous_degree(whole, N)
        } else {
            next_degree(whole, N)
        };
        let next = table[next as usize];
        approximate + (next - approximate) * fraction
    }
}

pub static SINE_TABLE: [Fraction; 360] = [
    Fraction::new_whole(0),
    Fraction::new_maybe_reduced(67, 3839),
    Fraction::new_maybe_reduced(179, 5129),
    Fraction::new_maybe_reduced(177, 3382),
    Fraction::new_maybe_reduced(149, 2136),
    Fraction::new_maybe_reduced(1180, 13539),
    Fraction::new_maybe_reduced(307, 2937),
    Fraction::new_maybe_reduced(399, 3274),
    Fraction::new_maybe_reduced(340, 2443),
    Fraction::new_maybe_reduced(265, 1694),
    Fraction::new_maybe_reduced(228, 1313),
    Fraction::new_maybe_reduced(710, 3721),
    Fraction::new_maybe_reduced(226, 1087),
    Fraction::new_maybe_reduced(806, 3583),
    Fraction::new_maybe_reduced(861, 3559),
    Fraction::new_maybe_reduced(675, 2608),
    Fraction::new_maybe_reduced(973, 3530),
    Fraction::new_maybe_reduced(985, 3369),
    Fraction::new_maybe_reduced(987, 3194),
    Fraction::new_maybe_reduced(573, 1760),
    Fraction::new_maybe_reduced(1588, 4643),
    Fraction::new_maybe_reduced(606, 1691),
    Fraction::new_maybe_reduced(357, 953),
    Fraction::new_maybe_reduced(978, 2503),
    Fraction::new_maybe_reduced(1123, 2761),
    Fraction::new_maybe_reduced(2870, 6791),
    Fraction::new_maybe_reduced(1195, 2726),
    Fraction::new_maybe_reduced(967, 2130),
    Fraction::new_maybe_reduced(915, 1949),
    Fraction::new_maybe_reduced(1133, 2337),
    Fraction::new_maybe_reduced(1, 2),
    Fraction::new_maybe_reduced(2894, 5619),
    Fraction::new_maybe_reduced(921, 1738),
    Fraction::new_maybe_reduced(1275, 2341),
    Fraction::new_maybe_reduced(1247, 2230),
    Fraction::new_maybe_reduced(1793, 3126),
    Fraction::new_maybe_reduced(3917, 6664),
    Fraction::new_maybe_reduced(1061, 1763),
    Fraction::new_maybe_reduced(684, 1111),
    Fraction::new_maybe_reduced(2185, 3472),
    Fraction::new_maybe_reduced(1319, 2052),
    Fraction::new_maybe_reduced(2041, 3111),
    Fraction::new_maybe_reduced(1901, 2841),
    Fraction::new_maybe_reduced(860, 1261),
    Fraction::new_maybe_reduced(2614, 3763),
    Fraction::new_maybe_reduced(2378, 3363),
    Fraction::new_maybe_reduced(4839, 6727),
    Fraction::new_maybe_reduced(1059, 1448),
    Fraction::new_maybe_reduced(1328, 1787),
    Fraction::new_maybe_reduced(1923, 2548),
    Fraction::new_maybe_reduced(1683, 2197),
    Fraction::new_maybe_reduced(1367, 1759),
    Fraction::new_maybe_reduced(1446, 1835),
    Fraction::new_maybe_reduced(3161, 3958),
    Fraction::new_maybe_reduced(2889, 3571),
    Fraction::new_maybe_reduced(2686, 3279),
    Fraction::new_maybe_reduced(2541, 3065),
    Fraction::new_maybe_reduced(1388, 1655),
    Fraction::new_maybe_reduced(1412, 1665),
    Fraction::new_maybe_reduced(4981, 5811),
    Fraction::new_maybe_reduced(2521, 2911),
    Fraction::new_maybe_reduced(1437, 1643),
    Fraction::new_maybe_reduced(2708, 3067),
    Fraction::new_maybe_reduced(1496, 1679),
    Fraction::new_maybe_reduced(2087, 2322),
    Fraction::new_maybe_reduced(3434, 3789),
    Fraction::new_maybe_reduced(2927, 3204),
    Fraction::new_maybe_reduced(1459, 1585),
    Fraction::new_maybe_reduced(6061, 6537),
    Fraction::new_maybe_reduced(3022, 3237),
    Fraction::new_maybe_reduced(2384, 2537),
    Fraction::new_maybe_reduced(538, 569),
    Fraction::new_maybe_reduced(3556, 3739),
    Fraction::new_maybe_reduced(4027, 4211),
    Fraction::new_maybe_reduced(1737, 1807),
    Fraction::new_maybe_reduced(652, 675),
    Fraction::new_maybe_reduced(6631, 6834),
    Fraction::new_maybe_reduced(2243, 2302),
    Fraction::new_maybe_reduced(940, 961),
    Fraction::new_maybe_reduced(374, 381),
    Fraction::new_maybe_reduced(1102, 1119),
    Fraction::new_maybe_reduced(3931, 3980),
    Fraction::new_maybe_reduced(4579, 4624),
    Fraction::new_maybe_reduced(2530, 2549),
    Fraction::new_maybe_reduced(1997, 2008),
    Fraction::new_maybe_reduced(1309, 1314),
    Fraction::new_maybe_reduced(819, 821),
    Fraction::new_maybe_reduced(2186, 2189),
    Fraction::new_maybe_reduced(1641, 1642),
    Fraction::new_maybe_reduced(6560, 6561),
    Fraction::new_whole(1),
    Fraction::new_maybe_reduced(6560, 6561),
    Fraction::new_maybe_reduced(1641, 1642),
    Fraction::new_maybe_reduced(2186, 2189),
    Fraction::new_maybe_reduced(819, 821),
    Fraction::new_maybe_reduced(3665, 3679),
    Fraction::new_maybe_reduced(1997, 2008),
    Fraction::new_maybe_reduced(2530, 2549),
    Fraction::new_maybe_reduced(4579, 4624),
    Fraction::new_maybe_reduced(3931, 3980),
    Fraction::new_maybe_reduced(1102, 1119),
    Fraction::new_maybe_reduced(374, 381),
    Fraction::new_maybe_reduced(2999, 3066),
    Fraction::new_maybe_reduced(2243, 2302),
    Fraction::new_maybe_reduced(6631, 6834),
    Fraction::new_maybe_reduced(652, 675),
    Fraction::new_maybe_reduced(1737, 1807),
    Fraction::new_maybe_reduced(766, 801),
    Fraction::new_maybe_reduced(2701, 2840),
    Fraction::new_maybe_reduced(5623, 5947),
    Fraction::new_maybe_reduced(2384, 2537),
    Fraction::new_maybe_reduced(3022, 3237),
    Fraction::new_maybe_reduced(5679, 6125),
    Fraction::new_maybe_reduced(1459, 1585),
    Fraction::new_maybe_reduced(2927, 3204),
    Fraction::new_maybe_reduced(2457, 2711),
    Fraction::new_maybe_reduced(1714, 1907),
    Fraction::new_maybe_reduced(1496, 1679),
    Fraction::new_maybe_reduced(2708, 3067),
    Fraction::new_maybe_reduced(1437, 1643),
    Fraction::new_maybe_reduced(2521, 2911),
    Fraction::new_maybe_reduced(4981, 5811),
    Fraction::new_maybe_reduced(1412, 1665),
    Fraction::new_maybe_reduced(1388, 1655),
    Fraction::new_maybe_reduced(1576, 1901),
    Fraction::new_maybe_reduced(2763, 3373),
    Fraction::new_maybe_reduced(1292, 1597),
    Fraction::new_maybe_reduced(3395, 4251),
    Fraction::new_maybe_reduced(2353, 2986),
    Fraction::new_maybe_reduced(1367, 1759),
    Fraction::new_maybe_reduced(1313, 1714),
    Fraction::new_maybe_reduced(1883, 2495),
    Fraction::new_maybe_reduced(1328, 1787),
    Fraction::new_maybe_reduced(1059, 1448),
    Fraction::new_maybe_reduced(305, 424),
    Fraction::new_maybe_reduced(2378, 3363),
    Fraction::new_maybe_reduced(2796, 4025),
    Fraction::new_maybe_reduced(860, 1261),
    Fraction::new_maybe_reduced(1901, 2841),
    Fraction::new_maybe_reduced(2577, 3928),
    Fraction::new_maybe_reduced(1319, 2052),
    Fraction::new_maybe_reduced(1657, 2633),
    Fraction::new_maybe_reduced(684, 1111),
    Fraction::new_maybe_reduced(1658, 2755),
    Fraction::new_maybe_reduced(3686, 6271),
    Fraction::new_maybe_reduced(1259, 2195),
    Fraction::new_maybe_reduced(1247, 2230),
    Fraction::new_maybe_reduced(1275, 2341),
    Fraction::new_maybe_reduced(983, 1855),
    Fraction::new_maybe_reduced(3442, 6683),
    Fraction::new_maybe_reduced(1, 2),
    Fraction::new_maybe_reduced(1133, 2337),
    Fraction::new_maybe_reduced(915, 1949),
    Fraction::new_maybe_reduced(1041, 2293),
    Fraction::new_maybe_reduced(1195, 2726),
    Fraction::new_maybe_reduced(3012, 7127),
    Fraction::new_maybe_reduced(1123, 2761),
    Fraction::new_maybe_reduced(1037, 2654),
    Fraction::new_maybe_reduced(357, 953),
    Fraction::new_maybe_reduced(606, 1691),
    Fraction::new_maybe_reduced(1903, 5564),
    Fraction::new_maybe_reduced(573, 1760),
    Fraction::new_maybe_reduced(987, 3194),
    Fraction::new_maybe_reduced(916, 3133),
    Fraction::new_maybe_reduced(465, 1687),
    Fraction::new_maybe_reduced(653, 2523),
    Fraction::new_maybe_reduced(569, 2352),
    Fraction::new_maybe_reduced(806, 3583),
    Fraction::new_maybe_reduced(226, 1087),
    Fraction::new_maybe_reduced(519, 2720),
    Fraction::new_maybe_reduced(485, 2793),
    Fraction::new_maybe_reduced(265, 1694),
    Fraction::new_maybe_reduced(313, 2249),
    Fraction::new_maybe_reduced(326, 2675),
    Fraction::new_maybe_reduced(307, 2937),
    Fraction::new_maybe_reduced(914, 10487),
    Fraction::new_maybe_reduced(149, 2136),
    Fraction::new_maybe_reduced(149, 2847),
    Fraction::new_maybe_reduced(205, 5874),
    Fraction::new_maybe_reduced(57, 3266),
    Fraction::new_whole(0),
    Fraction::new_maybe_reduced(-67, 3839),
    Fraction::new_maybe_reduced(-127, 3639),
    Fraction::new_maybe_reduced(-177, 3382),
    Fraction::new_maybe_reduced(-149, 2136),
    Fraction::new_maybe_reduced(-1465, 16809),
    Fraction::new_maybe_reduced(-307, 2937),
    Fraction::new_maybe_reduced(-472, 3873),
    Fraction::new_maybe_reduced(-340, 2443),
    Fraction::new_maybe_reduced(-265, 1694),
    Fraction::new_maybe_reduced(-485, 2793),
    Fraction::new_maybe_reduced(-710, 3721),
    Fraction::new_maybe_reduced(-473, 2275),
    Fraction::new_maybe_reduced(-577, 2565),
    Fraction::new_maybe_reduced(-569, 2352),
    Fraction::new_maybe_reduced(-719, 2778),
    Fraction::new_maybe_reduced(-508, 1843),
    Fraction::new_maybe_reduced(-847, 2897),
    Fraction::new_maybe_reduced(-305, 987),
    Fraction::new_maybe_reduced(-573, 1760),
    Fraction::new_maybe_reduced(-1168, 3415),
    Fraction::new_maybe_reduced(-773, 2157),
    Fraction::new_maybe_reduced(-357, 953),
    Fraction::new_maybe_reduced(-919, 2352),
    Fraction::new_maybe_reduced(-966, 2375),
    Fraction::new_maybe_reduced(-2799, 6623),
    Fraction::new_maybe_reduced(-1195, 2726),
    Fraction::new_maybe_reduced(-967, 2130),
    Fraction::new_maybe_reduced(-1484, 3161),
    Fraction::new_maybe_reduced(-1133, 2337),
    Fraction::new_maybe_reduced(-1, 2),
    Fraction::new_maybe_reduced(-2620, 5087),
    Fraction::new_maybe_reduced(-983, 1855),
    Fraction::new_maybe_reduced(-1214, 2229),
    Fraction::new_maybe_reduced(-1247, 2230),
    Fraction::new_maybe_reduced(-1259, 2195),
    Fraction::new_maybe_reduced(-5226, 8891),
    Fraction::new_maybe_reduced(-1061, 1763),
    Fraction::new_maybe_reduced(-2225, 3614),
    Fraction::new_maybe_reduced(-528, 839),
    Fraction::new_maybe_reduced(-1319, 2052),
    Fraction::new_maybe_reduced(-3113, 4745),
    Fraction::new_maybe_reduced(-2263, 3382),
    Fraction::new_maybe_reduced(-860, 1261),
    Fraction::new_maybe_reduced(-2432, 3501),
    Fraction::new_maybe_reduced(-985, 1393),
    Fraction::new_maybe_reduced(-4839, 6727),
    Fraction::new_maybe_reduced(-2069, 2829),
    Fraction::new_maybe_reduced(-1328, 1787),
    Fraction::new_maybe_reduced(-1923, 2548),
    Fraction::new_maybe_reduced(-1683, 2197),
    Fraction::new_maybe_reduced(-1367, 1759),
    Fraction::new_maybe_reduced(-1446, 1835),
    Fraction::new_maybe_reduced(-2693, 3372),
    Fraction::new_maybe_reduced(-1292, 1597),
    Fraction::new_maybe_reduced(-2686, 3279),
    Fraction::new_maybe_reduced(-2541, 3065),
    Fraction::new_maybe_reduced(-1388, 1655),
    Fraction::new_maybe_reduced(-1825, 2152),
    Fraction::new_maybe_reduced(-4957, 5783),
    Fraction::new_maybe_reduced(-2521, 2911),
    Fraction::new_maybe_reduced(-1437, 1643),
    Fraction::new_maybe_reduced(-2708, 3067),
    Fraction::new_maybe_reduced(-1496, 1679),
    Fraction::new_maybe_reduced(-2087, 2322),
    Fraction::new_maybe_reduced(-3434, 3789),
    Fraction::new_maybe_reduced(-2927, 3204),
    Fraction::new_maybe_reduced(-1459, 1585),
    Fraction::new_maybe_reduced(-7207, 7773),
    Fraction::new_maybe_reduced(-2769, 2966),
    Fraction::new_maybe_reduced(-2384, 2537),
    Fraction::new_maybe_reduced(-538, 569),
    Fraction::new_maybe_reduced(-2701, 2840),
    Fraction::new_maybe_reduced(-3261, 3410),
    Fraction::new_maybe_reduced(-1737, 1807),
    Fraction::new_maybe_reduced(-652, 675),
    Fraction::new_maybe_reduced(-7219, 7440),
    Fraction::new_maybe_reduced(-2243, 2302),
    Fraction::new_maybe_reduced(-2999, 3066),
    Fraction::new_maybe_reduced(-374, 381),
    Fraction::new_maybe_reduced(-1102, 1119),
    Fraction::new_maybe_reduced(-3209, 3249),
    Fraction::new_maybe_reduced(-4172, 4213),
    Fraction::new_maybe_reduced(-2530, 2549),
    Fraction::new_maybe_reduced(-1997, 2008),
    Fraction::new_maybe_reduced(-1309, 1314),
    Fraction::new_maybe_reduced(-819, 821),
    Fraction::new_maybe_reduced(-2186, 2189),
    Fraction::new_maybe_reduced(-1641, 1642),
    Fraction::new_maybe_reduced(-6560, 6561),
    Fraction::new_whole(-1),
    Fraction::new_maybe_reduced(-6560, 6561),
    Fraction::new_maybe_reduced(-1641, 1642),
    Fraction::new_maybe_reduced(-2186, 2189),
    Fraction::new_maybe_reduced(-819, 821),
    Fraction::new_maybe_reduced(-1309, 1314),
    Fraction::new_maybe_reduced(-1997, 2008),
    Fraction::new_maybe_reduced(-2530, 2549),
    Fraction::new_maybe_reduced(-4579, 4624),
    Fraction::new_maybe_reduced(-3931, 3980),
    Fraction::new_maybe_reduced(-2917, 2962),
    Fraction::new_maybe_reduced(-374, 381),
    Fraction::new_maybe_reduced(-2999, 3066),
    Fraction::new_maybe_reduced(-2243, 2302),
    Fraction::new_maybe_reduced(-6631, 6834),
    Fraction::new_maybe_reduced(-3997, 4138),
    Fraction::new_maybe_reduced(-1737, 1807),
    Fraction::new_maybe_reduced(-3261, 3410),
    Fraction::new_maybe_reduced(-2701, 2840),
    Fraction::new_maybe_reduced(-538, 569),
    Fraction::new_maybe_reduced(-2384, 2537),
    Fraction::new_maybe_reduced(-3022, 3237),
    Fraction::new_maybe_reduced(-5297, 5713),
    Fraction::new_maybe_reduced(-1459, 1585),
    Fraction::new_maybe_reduced(-2927, 3204),
    Fraction::new_maybe_reduced(-3434, 3789),
    Fraction::new_maybe_reduced(-1714, 1907),
    Fraction::new_maybe_reduced(-1496, 1679),
    Fraction::new_maybe_reduced(-2708, 3067),
    Fraction::new_maybe_reduced(-1437, 1643),
    Fraction::new_maybe_reduced(-2521, 2911),
    Fraction::new_maybe_reduced(-5017, 5853),
    Fraction::new_maybe_reduced(-1412, 1665),
    Fraction::new_maybe_reduced(-2069, 2467),
    Fraction::new_maybe_reduced(-2541, 3065),
    Fraction::new_maybe_reduced(-2686, 3279),
    Fraction::new_maybe_reduced(-1292, 1597),
    Fraction::new_maybe_reduced(-3629, 4544),
    Fraction::new_maybe_reduced(-2353, 2986),
    Fraction::new_maybe_reduced(-1503, 1934),
    Fraction::new_maybe_reduced(-1683, 2197),
    Fraction::new_maybe_reduced(-1923, 2548),
    Fraction::new_maybe_reduced(-2141, 2881),
    Fraction::new_maybe_reduced(-1059, 1448),
    Fraction::new_maybe_reduced(-305, 424),
    Fraction::new_maybe_reduced(-1393, 1970),
    Fraction::new_maybe_reduced(-2887, 4156),
    Fraction::new_maybe_reduced(-2239, 3283),
    Fraction::new_maybe_reduced(-1539, 2300),
    Fraction::new_maybe_reduced(-536, 817),
    Fraction::new_maybe_reduced(-1319, 2052),
    Fraction::new_maybe_reduced(-1657, 2633),
    Fraction::new_maybe_reduced(-2225, 3614),
    Fraction::new_maybe_reduced(-1061, 1763),
    Fraction::new_maybe_reduced(-4071, 6926),
    Fraction::new_maybe_reduced(-1259, 2195),
    Fraction::new_maybe_reduced(-1025, 1833),
    Fraction::new_maybe_reduced(-1214, 2229),
    Fraction::new_maybe_reduced(-983, 1855),
    Fraction::new_maybe_reduced(-2894, 5619),
    Fraction::new_maybe_reduced(-1, 2),
    Fraction::new_maybe_reduced(-1133, 2337),
    Fraction::new_maybe_reduced(-915, 1949),
    Fraction::new_maybe_reduced(-1115, 2456),
    Fraction::new_maybe_reduced(-1195, 2726),
    Fraction::new_maybe_reduced(-2231, 5279),
    Fraction::new_maybe_reduced(-1280, 3147),
    Fraction::new_maybe_reduced(-978, 2503),
    Fraction::new_maybe_reduced(-1189, 3174),
    Fraction::new_maybe_reduced(-1045, 2916),
    Fraction::new_maybe_reduced(-1273, 3722),
    Fraction::new_maybe_reduced(-1132, 3477),
    Fraction::new_maybe_reduced(-987, 3194),
    Fraction::new_maybe_reduced(-778, 2661),
    Fraction::new_maybe_reduced(-887, 3218),
    Fraction::new_maybe_reduced(-631, 2438),
    Fraction::new_maybe_reduced(-569, 2352),
    Fraction::new_maybe_reduced(-1035, 4601),
    Fraction::new_maybe_reduced(-226, 1087),
    Fraction::new_maybe_reduced(-328, 1719),
    Fraction::new_maybe_reduced(-655, 3772),
    Fraction::new_maybe_reduced(-265, 1694),
    Fraction::new_maybe_reduced(-313, 2249),
    Fraction::new_maybe_reduced(-472, 3873),
    Fraction::new_maybe_reduced(-247, 2363),
    Fraction::new_maybe_reduced(-762, 8743),
    Fraction::new_maybe_reduced(-146, 2093),
    Fraction::new_maybe_reduced(-177, 3382),
    Fraction::new_maybe_reduced(-127, 3639),
    Fraction::new_maybe_reduced(-127, 7277),
];

pub static COSINE_TABLE: [Fraction; 360] = [
    Fraction::new_whole(1),
    Fraction::new_maybe_reduced(6560, 6561),
    Fraction::new_maybe_reduced(1641, 1642),
    Fraction::new_maybe_reduced(2186, 2189),
    Fraction::new_maybe_reduced(819, 821),
    Fraction::new_maybe_reduced(1309, 1314),
    Fraction::new_maybe_reduced(1997, 2008),
    Fraction::new_maybe_reduced(2530, 2549),
    Fraction::new_maybe_reduced(4579, 4624),
    Fraction::new_maybe_reduced(3931, 3980),
    Fraction::new_maybe_reduced(1102, 1119),
    Fraction::new_maybe_reduced(374, 381),
    Fraction::new_maybe_reduced(940, 961),
    Fraction::new_maybe_reduced(2243, 2302),
    Fraction::new_maybe_reduced(6631, 6834),
    Fraction::new_maybe_reduced(652, 675),
    Fraction::new_maybe_reduced(1737, 1807),
    Fraction::new_maybe_reduced(766, 801),
    Fraction::new_maybe_reduced(3556, 3739),
    Fraction::new_maybe_reduced(538, 569),
    Fraction::new_maybe_reduced(2384, 2537),
    Fraction::new_maybe_reduced(3022, 3237),
    Fraction::new_maybe_reduced(6061, 6537),
    Fraction::new_maybe_reduced(1459, 1585),
    Fraction::new_maybe_reduced(2927, 3204),
    Fraction::new_maybe_reduced(2457, 2711),
    Fraction::new_maybe_reduced(1714, 1907),
    Fraction::new_maybe_reduced(1496, 1679),
    Fraction::new_maybe_reduced(2708, 3067),
    Fraction::new_maybe_reduced(1437, 1643),
    Fraction::new_maybe_reduced(2521, 2911),
    Fraction::new_maybe_reduced(4981, 5811),
    Fraction::new_maybe_reduced(1412, 1665),
    Fraction::new_maybe_reduced(1388, 1655),
    Fraction::new_maybe_reduced(2541, 3065),
    Fraction::new_maybe_reduced(2763, 3373),
    Fraction::new_maybe_reduced(1292, 1597),
    Fraction::new_maybe_reduced(3395, 4251),
    Fraction::new_maybe_reduced(1446, 1835),
    Fraction::new_maybe_reduced(1503, 1934),
    Fraction::new_maybe_reduced(1313, 1714),
    Fraction::new_maybe_reduced(1923, 2548),
    Fraction::new_maybe_reduced(1328, 1787),
    Fraction::new_maybe_reduced(1059, 1448),
    Fraction::new_maybe_reduced(5449, 7575),
    Fraction::new_maybe_reduced(2378, 3363),
    Fraction::new_maybe_reduced(2705, 3894),
    Fraction::new_maybe_reduced(860, 1261),
    Fraction::new_maybe_reduced(1539, 2300),
    Fraction::new_maybe_reduced(2041, 3111),
    Fraction::new_maybe_reduced(1319, 2052),
    Fraction::new_maybe_reduced(2185, 3472),
    Fraction::new_maybe_reduced(684, 1111),
    Fraction::new_maybe_reduced(1061, 1763),
    Fraction::new_maybe_reduced(3686, 6271),
    Fraction::new_maybe_reduced(1259, 2195),
    Fraction::new_maybe_reduced(1247, 2230),
    Fraction::new_maybe_reduced(1214, 2229),
    Fraction::new_maybe_reduced(983, 1855),
    Fraction::new_maybe_reduced(3168, 6151),
    Fraction::new_maybe_reduced(1, 2),
    Fraction::new_maybe_reduced(1133, 2337),
    Fraction::new_maybe_reduced(915, 1949),
    Fraction::new_maybe_reduced(967, 2130),
    Fraction::new_maybe_reduced(1604, 3659),
    Fraction::new_maybe_reduced(2728, 6455),
    Fraction::new_maybe_reduced(1123, 2761),
    Fraction::new_maybe_reduced(978, 2503),
    Fraction::new_maybe_reduced(357, 953),
    Fraction::new_maybe_reduced(773, 2157),
    Fraction::new_maybe_reduced(1798, 5257),
    Fraction::new_maybe_reduced(573, 1760),
    Fraction::new_maybe_reduced(987, 3194),
    Fraction::new_maybe_reduced(916, 3133),
    Fraction::new_maybe_reduced(465, 1687),
    Fraction::new_maybe_reduced(675, 2608),
    Fraction::new_maybe_reduced(861, 3559),
    Fraction::new_maybe_reduced(806, 3583),
    Fraction::new_maybe_reduced(226, 1087),
    Fraction::new_maybe_reduced(519, 2720),
    Fraction::new_maybe_reduced(228, 1313),
    Fraction::new_maybe_reduced(265, 1694),
    Fraction::new_maybe_reduced(340, 2443),
    Fraction::new_maybe_reduced(399, 3274),
    Fraction::new_maybe_reduced(277, 2650),
    Fraction::new_maybe_reduced(1427, 16373),
    Fraction::new_maybe_reduced(146, 2093),
    Fraction::new_maybe_reduced(177, 3382),
    Fraction::new_maybe_reduced(179, 5129),
    Fraction::new_maybe_reduced(67, 3839),
    Fraction::new_whole(0),
    Fraction::new_maybe_reduced(-57, 3266),
    Fraction::new_maybe_reduced(-127, 3639),
    Fraction::new_maybe_reduced(-177, 3382),
    Fraction::new_maybe_reduced(-149, 2136),
    Fraction::new_maybe_reduced(-19, 218),
    Fraction::new_maybe_reduced(-337, 3224),
    Fraction::new_maybe_reduced(-399, 3274),
    Fraction::new_maybe_reduced(-340, 2443),
    Fraction::new_maybe_reduced(-265, 1694),
    Fraction::new_maybe_reduced(-485, 2793),
    Fraction::new_maybe_reduced(-710, 3721),
    Fraction::new_maybe_reduced(-226, 1087),
    Fraction::new_maybe_reduced(-806, 3583),
    Fraction::new_maybe_reduced(-861, 3559),
    Fraction::new_maybe_reduced(-675, 2608),
    Fraction::new_maybe_reduced(-465, 1687),
    Fraction::new_maybe_reduced(-985, 3369),
    Fraction::new_maybe_reduced(-305, 987),
    Fraction::new_maybe_reduced(-573, 1760),
    Fraction::new_maybe_reduced(-1588, 4643),
    Fraction::new_maybe_reduced(-773, 2157),
    Fraction::new_maybe_reduced(-1310, 3497),
    Fraction::new_maybe_reduced(-978, 2503),
    Fraction::new_maybe_reduced(-1123, 2761),
    Fraction::new_maybe_reduced(-3012, 7127),
    Fraction::new_maybe_reduced(-786, 1793),
    Fraction::new_maybe_reduced(-1041, 2293),
    Fraction::new_maybe_reduced(-915, 1949),
    Fraction::new_maybe_reduced(-1516, 3127),
    Fraction::new_maybe_reduced(-1, 2),
    Fraction::new_maybe_reduced(-3442, 6683),
    Fraction::new_maybe_reduced(-921, 1738),
    Fraction::new_maybe_reduced(-1275, 2341),
    Fraction::new_maybe_reduced(-1469, 2627),
    Fraction::new_maybe_reduced(-1259, 2195),
    Fraction::new_maybe_reduced(-3686, 6271),
    Fraction::new_maybe_reduced(-1061, 1763),
    Fraction::new_maybe_reduced(-684, 1111),
    Fraction::new_maybe_reduced(-2185, 3472),
    Fraction::new_maybe_reduced(-1319, 2052),
    Fraction::new_maybe_reduced(-1505, 2294),
    Fraction::new_maybe_reduced(-1901, 2841),
    Fraction::new_maybe_reduced(-860, 1261),
    Fraction::new_maybe_reduced(-2523, 3632),
    Fraction::new_maybe_reduced(-2378, 3363),
    Fraction::new_maybe_reduced(-3924, 5455),
    Fraction::new_maybe_reduced(-2069, 2829),
    Fraction::new_maybe_reduced(-1328, 1787),
    Fraction::new_maybe_reduced(-1923, 2548),
    Fraction::new_maybe_reduced(-1683, 2197),
    Fraction::new_maybe_reduced(-1367, 1759),
    Fraction::new_maybe_reduced(-1446, 1835),
    Fraction::new_maybe_reduced(-2927, 3665),
    Fraction::new_maybe_reduced(-2889, 3571),
    Fraction::new_maybe_reduced(-2609, 3185),
    Fraction::new_maybe_reduced(-2541, 3065),
    Fraction::new_maybe_reduced(-1388, 1655),
    Fraction::new_maybe_reduced(-1412, 1665),
    Fraction::new_maybe_reduced(-4981, 5811),
    Fraction::new_maybe_reduced(-2521, 2911),
    Fraction::new_maybe_reduced(-2588, 2959),
    Fraction::new_maybe_reduced(-2708, 3067),
    Fraction::new_maybe_reduced(-1496, 1679),
    Fraction::new_maybe_reduced(-1714, 1907),
    Fraction::new_maybe_reduced(-2457, 2711),
    Fraction::new_maybe_reduced(-2927, 3204),
    Fraction::new_maybe_reduced(-2698, 2931),
    Fraction::new_maybe_reduced(-6634, 7155),
    Fraction::new_maybe_reduced(-2769, 2966),
    Fraction::new_maybe_reduced(-2384, 2537),
    Fraction::new_maybe_reduced(-5623, 5947),
    Fraction::new_maybe_reduced(-2701, 2840),
    Fraction::new_maybe_reduced(-4027, 4211),
    Fraction::new_maybe_reduced(-1737, 1807),
    Fraction::new_maybe_reduced(-652, 675),
    Fraction::new_maybe_reduced(-6631, 6834),
    Fraction::new_maybe_reduced(-2243, 2302),
    Fraction::new_maybe_reduced(-940, 961),
    Fraction::new_maybe_reduced(-374, 381),
    Fraction::new_maybe_reduced(-1102, 1119),
    Fraction::new_maybe_reduced(-3931, 3980),
    Fraction::new_maybe_reduced(-4172, 4213),
    Fraction::new_maybe_reduced(-2530, 2549),
    Fraction::new_maybe_reduced(-1997, 2008),
    Fraction::new_maybe_reduced(-1309, 1314),
    Fraction::new_maybe_reduced(-819, 821),
    Fraction::new_maybe_reduced(-2186, 2189),
    Fraction::new_maybe_reduced(-1641, 1642),
    Fraction::new_maybe_reduced(-6560, 6561),
    Fraction::new_whole(-1),
    Fraction::new_maybe_reduced(-6560, 6561),
    Fraction::new_maybe_reduced(-1641, 1642),
    Fraction::new_maybe_reduced(-2186, 2189),
    Fraction::new_maybe_reduced(-819, 821),
    Fraction::new_maybe_reduced(-1309, 1314),
    Fraction::new_maybe_reduced(-1997, 2008),
    Fraction::new_maybe_reduced(-2530, 2549),
    Fraction::new_maybe_reduced(-4579, 4624),
    Fraction::new_maybe_reduced(-3931, 3980),
    Fraction::new_maybe_reduced(-1102, 1119),
    Fraction::new_maybe_reduced(-374, 381),
    Fraction::new_maybe_reduced(-2999, 3066),
    Fraction::new_maybe_reduced(-2243, 2302),
    Fraction::new_maybe_reduced(-6631, 6834),
    Fraction::new_maybe_reduced(-4649, 4813),
    Fraction::new_maybe_reduced(-1737, 1807),
    Fraction::new_maybe_reduced(-4027, 4211),
    Fraction::new_maybe_reduced(-2701, 2840),
    Fraction::new_maybe_reduced(-538, 569),
    Fraction::new_maybe_reduced(-2384, 2537),
    Fraction::new_maybe_reduced(-3022, 3237),
    Fraction::new_maybe_reduced(-5679, 6125),
    Fraction::new_maybe_reduced(-1459, 1585),
    Fraction::new_maybe_reduced(-2927, 3204),
    Fraction::new_maybe_reduced(-3434, 3789),
    Fraction::new_maybe_reduced(-1714, 1907),
    Fraction::new_maybe_reduced(-1496, 1679),
    Fraction::new_maybe_reduced(-2097, 2375),
    Fraction::new_maybe_reduced(-1437, 1643),
    Fraction::new_maybe_reduced(-2521, 2911),
    Fraction::new_maybe_reduced(-4993, 5825),
    Fraction::new_maybe_reduced(-1412, 1665),
    Fraction::new_maybe_reduced(-1388, 1655),
    Fraction::new_maybe_reduced(-2541, 3065),
    Fraction::new_maybe_reduced(-2686, 3279),
    Fraction::new_maybe_reduced(-1292, 1597),
    Fraction::new_maybe_reduced(-3395, 4251),
    Fraction::new_maybe_reduced(-1446, 1835),
    Fraction::new_maybe_reduced(-1503, 1934),
    Fraction::new_maybe_reduced(-1683, 2197),
    Fraction::new_maybe_reduced(-1923, 2548),
    Fraction::new_maybe_reduced(-2141, 2881),
    Fraction::new_maybe_reduced(-1059, 1448),
    Fraction::new_maybe_reduced(-305, 424),
    Fraction::new_maybe_reduced(-1393, 1970),
    Fraction::new_maybe_reduced(-2705, 3894),
    Fraction::new_maybe_reduced(-2239, 3283),
    Fraction::new_maybe_reduced(-1539, 2300),
    Fraction::new_maybe_reduced(-536, 817),
    Fraction::new_maybe_reduced(-1319, 2052),
    Fraction::new_maybe_reduced(-2185, 3472),
    Fraction::new_maybe_reduced(-1541, 2503),
    Fraction::new_maybe_reduced(-1658, 2755),
    Fraction::new_maybe_reduced(-4610, 7843),
    Fraction::new_maybe_reduced(-1259, 2195),
    Fraction::new_maybe_reduced(-1247, 2230),
    Fraction::new_maybe_reduced(-1153, 2117),
    Fraction::new_maybe_reduced(-1045, 1972),
    Fraction::new_maybe_reduced(-4401, 8545),
    Fraction::new_maybe_reduced(-1, 2),
    Fraction::new_maybe_reduced(-1133, 2337),
    Fraction::new_maybe_reduced(-915, 1949),
    Fraction::new_maybe_reduced(-1115, 2456),
    Fraction::new_maybe_reduced(-409, 933),
    Fraction::new_maybe_reduced(-2515, 5951),
    Fraction::new_maybe_reduced(-1123, 2761),
    Fraction::new_maybe_reduced(-919, 2352),
    Fraction::new_maybe_reduced(-1546, 4127),
    Fraction::new_maybe_reduced(-606, 1691),
    Fraction::new_maybe_reduced(-1798, 5257),
    Fraction::new_maybe_reduced(-573, 1760),
    Fraction::new_maybe_reduced(-305, 987),
    Fraction::new_maybe_reduced(-847, 2897),
    Fraction::new_maybe_reduced(-465, 1687),
    Fraction::new_maybe_reduced(-653, 2523),
    Fraction::new_maybe_reduced(-277, 1145),
    Fraction::new_maybe_reduced(-577, 2565),
    Fraction::new_maybe_reduced(-699, 3362),
    Fraction::new_maybe_reduced(-519, 2720),
    Fraction::new_maybe_reduced(-228, 1313),
    Fraction::new_maybe_reduced(-186, 1189),
    Fraction::new_maybe_reduced(-286, 2055),
    Fraction::new_maybe_reduced(-326, 2675),
    Fraction::new_maybe_reduced(-277, 2650),
    Fraction::new_maybe_reduced(-1085, 12449),
    Fraction::new_maybe_reduced(-149, 2136),
    Fraction::new_maybe_reduced(-121, 2312),
    Fraction::new_maybe_reduced(-26, 745),
    Fraction::new_maybe_reduced(-77, 4412),
    Fraction::new_whole(0),
    Fraction::new_maybe_reduced(77, 4412),
    Fraction::new_maybe_reduced(101, 2894),
    Fraction::new_maybe_reduced(233, 4452),
    Fraction::new_maybe_reduced(149, 2136),
    Fraction::new_maybe_reduced(1161, 13321),
    Fraction::new_maybe_reduced(277, 2650),
    Fraction::new_maybe_reduced(764, 6269),
    Fraction::new_maybe_reduced(340, 2443),
    Fraction::new_maybe_reduced(265, 1694),
    Fraction::new_maybe_reduced(257, 1480),
    Fraction::new_maybe_reduced(519, 2720),
    Fraction::new_maybe_reduced(699, 3362),
    Fraction::new_maybe_reduced(577, 2565),
    Fraction::new_maybe_reduced(861, 3559),
    Fraction::new_maybe_reduced(741, 2863),
    Fraction::new_maybe_reduced(551, 1999),
    Fraction::new_maybe_reduced(847, 2897),
    Fraction::new_maybe_reduced(305, 987),
    Fraction::new_maybe_reduced(573, 1760),
    Fraction::new_maybe_reduced(1063, 3108),
    Fraction::new_maybe_reduced(940, 2623),
    Fraction::new_maybe_reduced(953, 2544),
    Fraction::new_maybe_reduced(919, 2352),
    Fraction::new_maybe_reduced(1123, 2761),
    Fraction::new_maybe_reduced(2515, 5951),
    Fraction::new_maybe_reduced(786, 1793),
    Fraction::new_maybe_reduced(967, 2130),
    Fraction::new_maybe_reduced(1484, 3161),
    Fraction::new_maybe_reduced(1133, 2337),
    Fraction::new_maybe_reduced(1, 2),
    Fraction::new_maybe_reduced(2346, 4555),
    Fraction::new_maybe_reduced(921, 1738),
    Fraction::new_maybe_reduced(1275, 2341),
    Fraction::new_maybe_reduced(1247, 2230),
    Fraction::new_maybe_reduced(1259, 2195),
    Fraction::new_maybe_reduced(4918, 8367),
    Fraction::new_maybe_reduced(1061, 1763),
    Fraction::new_maybe_reduced(684, 1111),
    Fraction::new_maybe_reduced(528, 839),
    Fraction::new_maybe_reduced(1319, 2052),
    Fraction::new_maybe_reduced(536, 817),
    Fraction::new_maybe_reduced(2263, 3382),
    Fraction::new_maybe_reduced(860, 1261),
    Fraction::new_maybe_reduced(2250, 3239),
    Fraction::new_maybe_reduced(985, 1393),
    Fraction::new_maybe_reduced(3619, 5031),
    Fraction::new_maybe_reduced(2069, 2829),
    Fraction::new_maybe_reduced(1328, 1787),
    Fraction::new_maybe_reduced(1963, 2601),
    Fraction::new_maybe_reduced(1683, 2197),
    Fraction::new_maybe_reduced(1367, 1759),
    Fraction::new_maybe_reduced(1446, 1835),
    Fraction::new_maybe_reduced(3161, 3958),
    Fraction::new_maybe_reduced(1292, 1597),
    Fraction::new_maybe_reduced(2532, 3091),
    Fraction::new_maybe_reduced(965, 1164),
    Fraction::new_maybe_reduced(1388, 1655),
    Fraction::new_maybe_reduced(1412, 1665),
    Fraction::new_maybe_reduced(4993, 5825),
    Fraction::new_maybe_reduced(1351, 1560),
    Fraction::new_maybe_reduced(2588, 2959),
    Fraction::new_maybe_reduced(2708, 3067),
    Fraction::new_maybe_reduced(1823, 2046),
    Fraction::new_maybe_reduced(1714, 1907),
    Fraction::new_maybe_reduced(977, 1078),
    Fraction::new_maybe_reduced(2610, 2857),
    Fraction::new_maybe_reduced(1459, 1585),
    Fraction::new_maybe_reduced(7971, 8597),
    Fraction::new_maybe_reduced(2516, 2695),
    Fraction::new_maybe_reduced(2384, 2537),
    Fraction::new_maybe_reduced(5623, 5947),
    Fraction::new_maybe_reduced(3556, 3739),
    Fraction::new_maybe_reduced(3261, 3410),
    Fraction::new_maybe_reduced(1737, 1807),
    Fraction::new_maybe_reduced(652, 675),
    Fraction::new_maybe_reduced(6925, 7137),
    Fraction::new_maybe_reduced(2243, 2302),
    Fraction::new_maybe_reduced(2999, 3066),
    Fraction::new_maybe_reduced(374, 381),
    Fraction::new_maybe_reduced(1102, 1119),
    Fraction::new_maybe_reduced(3931, 3980),
    Fraction::new_maybe_reduced(4579, 4624),
    Fraction::new_maybe_reduced(2530, 2549),
    Fraction::new_maybe_reduced(1997, 2008),
    Fraction::new_maybe_reduced(1309, 1314),
    Fraction::new_maybe_reduced(819, 821),
    Fraction::new_maybe_reduced(2186, 2189),
    Fraction::new_maybe_reduced(1641, 1642),
    Fraction::new_maybe_reduced(6560, 6561),
];

/// This table is an even distribution of `0..=1` of arctan. Eg,
/// `TANGENT_TABLE[360] = 1f32.atan()` and `TANGENT_TABLE[179] = 0.5f32.atan()`
pub static TANGENT_TABLE: [Fraction; 360] = [
    Fraction::new_whole(0),
    Fraction::new_maybe_reduced(31, 1776),
    Fraction::new_maybe_reduced(426, 12199),
    Fraction::new_maybe_reduced(308, 5877),
    Fraction::new_maybe_reduced(153, 2188),
    Fraction::new_maybe_reduced(193, 2206),
    Fraction::new_maybe_reduced(348, 3311),
    Fraction::new_maybe_reduced(478, 3893),
    Fraction::new_maybe_reduced(1751, 12459),
    Fraction::new_maybe_reduced(647, 4085),
    Fraction::new_maybe_reduced(289, 1639),
    Fraction::new_maybe_reduced(505, 2598),
    Fraction::new_maybe_reduced(799, 3759),
    Fraction::new_maybe_reduced(359, 1555),
    Fraction::new_maybe_reduced(371, 1488),
    Fraction::new_maybe_reduced(571, 2131),
    Fraction::new_maybe_reduced(437, 1524),
    Fraction::new_maybe_reduced(1019, 3333),
    Fraction::new_maybe_reduced(708, 2179),
    Fraction::new_maybe_reduced(950, 2759),
    Fraction::new_maybe_reduced(2875, 7899),
    Fraction::new_maybe_reduced(904, 2355),
    Fraction::new_maybe_reduced(863, 2136),
    Fraction::new_maybe_reduced(1051, 2476),
    Fraction::new_maybe_reduced(1451, 3259),
    Fraction::new_maybe_reduced(2339, 5016),
    Fraction::new_maybe_reduced(1153, 2364),
    Fraction::new_maybe_reduced(1364, 2677),
    Fraction::new_maybe_reduced(1157, 2176),
    Fraction::new_maybe_reduced(1087, 1961),
    Fraction::new_maybe_reduced(1351, 2340),
    Fraction::new_maybe_reduced(1117, 1859),
    Fraction::new_maybe_reduced(598, 957),
    Fraction::new_maybe_reduced(1480, 2279),
    Fraction::new_maybe_reduced(1921, 2848),
    Fraction::new_maybe_reduced(675, 964),
    Fraction::new_maybe_reduced(1719, 2366),
    Fraction::new_maybe_reduced(6626, 8793),
    Fraction::new_maybe_reduced(2054, 2629),
    Fraction::new_maybe_reduced(2814, 3475),
    Fraction::new_maybe_reduced(2013, 2399),
    Fraction::new_maybe_reduced(2035, 2341),
    Fraction::new_maybe_reduced(3119, 3464),
    Fraction::new_maybe_reduced(16789, 18004),
    Fraction::new_maybe_reduced(1942, 2011),
    Fraction::new_whole(1),
    Fraction::new_maybe_reduced(2011, 1942),
    Fraction::new_maybe_reduced(14255, 13293),
    Fraction::new_maybe_reduced(743, 669),
    Fraction::new_maybe_reduced(2341, 2035),
    Fraction::new_maybe_reduced(2399, 2013),
    Fraction::new_maybe_reduced(3843, 3112),
    Fraction::new_maybe_reduced(3516, 2747),
    Fraction::new_maybe_reduced(8371, 6308),
    Fraction::new_maybe_reduced(3112, 2261),
    Fraction::new_maybe_reduced(5297, 3709),
    Fraction::new_maybe_reduced(2848, 1921),
    Fraction::new_maybe_reduced(2279, 1480),
    Fraction::new_maybe_reduced(4777, 2985),
    Fraction::new_maybe_reduced(3951, 2374),
    Fraction::new_maybe_reduced(5042, 2911),
    Fraction::new_maybe_reduced(1961, 1087),
    Fraction::new_maybe_reduced(2381, 1266),
    Fraction::new_maybe_reduced(2887, 1471),
    Fraction::new_maybe_reduced(6399, 3121),
    Fraction::new_maybe_reduced(6871, 3204),
    Fraction::new_maybe_reduced(6801, 3028),
    Fraction::new_maybe_reduced(6521, 2768),
    Fraction::new_maybe_reduced(5663, 2288),
    Fraction::new_maybe_reduced(5119, 1965),
    Fraction::new_maybe_reduced(7355, 2677),
    Fraction::new_maybe_reduced(6276, 2161),
    Fraction::new_maybe_reduced(10578, 3437),
    Fraction::new_maybe_reduced(6823, 2086),
    Fraction::new_maybe_reduced(5681, 1629),
    Fraction::new_maybe_reduced(5042, 1351),
    Fraction::new_maybe_reduced(10789, 2690),
    Fraction::new_maybe_reduced(1555, 359),
    Fraction::new_maybe_reduced(3759, 799),
    Fraction::new_maybe_reduced(8221, 1598),
    Fraction::new_maybe_reduced(10645, 1877),
    Fraction::new_maybe_reduced(9780, 1549),
    Fraction::new_maybe_reduced(18194, 2557),
    Fraction::new_maybe_reduced(4683, 575),
    Fraction::new_maybe_reduced(3311, 348),
    Fraction::new_maybe_reduced(17728, 1551),
    Fraction::new_maybe_reduced(6278, 439),
    Fraction::new_maybe_reduced(20932, 1097),
    Fraction::new_maybe_reduced(23854, 833),
    Fraction::new_maybe_reduced(13234, 231),
    Fraction::new_whole(-32768),
    Fraction::new_maybe_reduced(-16213, 283),
    Fraction::new_maybe_reduced(-29123, 1017),
    Fraction::new_maybe_reduced(-16696, 875),
    Fraction::new_maybe_reduced(-8609, 602),
    Fraction::new_maybe_reduced(-21237, 1858),
    Fraction::new_maybe_reduced(-4310, 453),
    Fraction::new_maybe_reduced(-12469, 1531),
    Fraction::new_maybe_reduced(-13939, 1959),
    Fraction::new_maybe_reduced(-17407, 2757),
    Fraction::new_maybe_reduced(-6970, 1229),
    Fraction::new_maybe_reduced(-7367, 1432),
    Fraction::new_maybe_reduced(-6403, 1361),
    Fraction::new_maybe_reduced(-5436, 1255),
    Fraction::new_maybe_reduced(-4837, 1206),
    Fraction::new_maybe_reduced(-10864, 2911),
    Fraction::new_maybe_reduced(-28541, 8184),
    Fraction::new_maybe_reduced(-7137, 2182),
    Fraction::new_maybe_reduced(-2496, 811),
    Fraction::new_maybe_reduced(-3517, 1211),
    Fraction::new_maybe_reduced(-9803, 3568),
    Fraction::new_maybe_reduced(-9011, 3459),
    Fraction::new_maybe_reduced(-2881, 1164),
    Fraction::new_maybe_reduced(-8474, 3597),
    Fraction::new_maybe_reduced(-7367, 3280),
    Fraction::new_maybe_reduced(-5387, 2512),
    Fraction::new_maybe_reduced(-4402, 2147),
    Fraction::new_maybe_reduced(-6404, 3263),
    Fraction::new_maybe_reduced(-4557, 2423),
    Fraction::new_maybe_reduced(-5349, 2965),
    Fraction::new_maybe_reduced(-3691, 2131),
    Fraction::new_maybe_reduced(-3951, 2374),
    Fraction::new_maybe_reduced(-6707, 4191),
    Fraction::new_maybe_reduced(-2279, 1480),
    Fraction::new_maybe_reduced(-3613, 2437),
    Fraction::new_maybe_reduced(-5297, 3709),
    Fraction::new_maybe_reduced(-3112, 2261),
    Fraction::new_maybe_reduced(-11114, 8375),
    Fraction::new_maybe_reduced(-1742, 1361),
    Fraction::new_maybe_reduced(-4211, 3410),
    Fraction::new_maybe_reduced(-2399, 2013),
    Fraction::new_maybe_reduced(-1094, 951),
    Fraction::new_maybe_reduced(-2721, 2450),
    Fraction::new_maybe_reduced(-14255, 13293),
    Fraction::new_maybe_reduced(-1807, 1745),
    Fraction::new_whole(-1),
    Fraction::new_maybe_reduced(-2139, 2215),
    Fraction::new_maybe_reduced(-12533, 13440),
    Fraction::new_maybe_reduced(-2450, 2721),
    Fraction::new_maybe_reduced(-2035, 2341),
    Fraction::new_maybe_reduced(-2571, 3064),
    Fraction::new_maybe_reduced(-3261, 4027),
    Fraction::new_maybe_reduced(-2054, 2629),
    Fraction::new_maybe_reduced(-4241, 5628),
    Fraction::new_maybe_reduced(-1990, 2739),
    Fraction::new_maybe_reduced(-2366, 3379),
    Fraction::new_maybe_reduced(-1749, 2593),
    Fraction::new_maybe_reduced(-1480, 2279),
    Fraction::new_maybe_reduced(-2387, 3820),
    Fraction::new_maybe_reduced(-1117, 1859),
    Fraction::new_maybe_reduced(-1351, 2340),
    Fraction::new_maybe_reduced(-1087, 1961),
    Fraction::new_maybe_reduced(-1157, 2176),
    Fraction::new_maybe_reduced(-1578, 3097),
    Fraction::new_maybe_reduced(-1153, 2364),
    Fraction::new_maybe_reduced(-2166, 4645),
    Fraction::new_maybe_reduced(-1325, 2976),
    Fraction::new_maybe_reduced(-1717, 4045),
    Fraction::new_maybe_reduced(-863, 2136),
    Fraction::new_maybe_reduced(-904, 2355),
    Fraction::new_maybe_reduced(-1984, 5451),
    Fraction::new_maybe_reduced(-950, 2759),
    Fraction::new_maybe_reduced(-708, 2179),
    Fraction::new_maybe_reduced(-971, 3176),
    Fraction::new_maybe_reduced(-437, 1524),
    Fraction::new_maybe_reduced(-780, 2911),
    Fraction::new_maybe_reduced(-371, 1488),
    Fraction::new_maybe_reduced(-359, 1555),
    Fraction::new_maybe_reduced(-518, 2437),
    Fraction::new_maybe_reduced(-588, 3025),
    Fraction::new_maybe_reduced(-289, 1639),
    Fraction::new_maybe_reduced(-647, 4085),
    Fraction::new_maybe_reduced(-2921, 20784),
    Fraction::new_maybe_reduced(-381, 3103),
    Fraction::new_maybe_reduced(-348, 3311),
    Fraction::new_maybe_reduced(-193, 2206),
    Fraction::new_maybe_reduced(-153, 2188),
    Fraction::new_maybe_reduced(-197, 3759),
    Fraction::new_maybe_reduced(-11, 315),
    Fraction::new_maybe_reduced(-38, 2177),
    Fraction::new_whole(0),
    Fraction::new_maybe_reduced(31, 1776),
    Fraction::new_maybe_reduced(294, 8419),
    Fraction::new_maybe_reduced(308, 5877),
    Fraction::new_maybe_reduced(153, 2188),
    Fraction::new_maybe_reduced(193, 2206),
    Fraction::new_maybe_reduced(313, 2978),
    Fraction::new_maybe_reduced(672, 5473),
    Fraction::new_maybe_reduced(1751, 12459),
    Fraction::new_maybe_reduced(596, 3763),
    Fraction::new_maybe_reduced(362, 2053),
    Fraction::new_maybe_reduced(505, 2598),
    Fraction::new_maybe_reduced(606, 2851),
    Fraction::new_maybe_reduced(537, 2326),
    Fraction::new_maybe_reduced(371, 1488),
    Fraction::new_maybe_reduced(933, 3482),
    Fraction::new_maybe_reduced(993, 3463),
    Fraction::new_maybe_reduced(923, 3019),
    Fraction::new_maybe_reduced(811, 2496),
    Fraction::new_maybe_reduced(689, 2001),
    Fraction::new_maybe_reduced(99, 272),
    Fraction::new_maybe_reduced(747, 1946),
    Fraction::new_maybe_reduced(863, 2136),
    Fraction::new_maybe_reduced(829, 1953),
    Fraction::new_maybe_reduced(1577, 3542),
    Fraction::new_maybe_reduced(2512, 5387),
    Fraction::new_maybe_reduced(1153, 2364),
    Fraction::new_maybe_reduced(1364, 2677),
    Fraction::new_maybe_reduced(1048, 1971),
    Fraction::new_maybe_reduced(1087, 1961),
    Fraction::new_maybe_reduced(780, 1351),
    Fraction::new_maybe_reduced(1117, 1859),
    Fraction::new_maybe_reduced(598, 957),
    Fraction::new_maybe_reduced(1041, 1603),
    Fraction::new_maybe_reduced(1921, 2848),
    Fraction::new_maybe_reduced(675, 964),
    Fraction::new_maybe_reduced(1177, 1620),
    Fraction::new_maybe_reduced(5990, 7949),
    Fraction::new_maybe_reduced(2747, 3516),
    Fraction::new_maybe_reduced(2218, 2739),
    Fraction::new_maybe_reduced(1528, 1821),
    Fraction::new_maybe_reduced(3119, 3588),
    Fraction::new_maybe_reduced(1781, 1978),
    Fraction::new_maybe_reduced(152, 163),
    Fraction::new_maybe_reduced(1548, 1603),
    Fraction::new_whole(1),
    Fraction::new_maybe_reduced(2011, 1942),
    Fraction::new_maybe_reduced(8387, 7821),
    Fraction::new_maybe_reduced(743, 669),
    Fraction::new_maybe_reduced(1247, 1084),
    Fraction::new_maybe_reduced(1821, 1528),
    Fraction::new_maybe_reduced(3843, 3112),
    Fraction::new_maybe_reduced(3580, 2797),
    Fraction::new_maybe_reduced(4573, 3446),
    Fraction::new_maybe_reduced(1993, 1448),
    Fraction::new_maybe_reduced(5307, 3716),
    Fraction::new_maybe_reduced(2848, 1921),
    Fraction::new_maybe_reduced(3457, 2245),
    Fraction::new_maybe_reduced(4769, 2980),
    Fraction::new_maybe_reduced(4417, 2654),
    Fraction::new_maybe_reduced(1351, 780),
    Fraction::new_maybe_reduced(1961, 1087),
    Fraction::new_maybe_reduced(2176, 1157),
    Fraction::new_maybe_reduced(3727, 1899),
    Fraction::new_maybe_reduced(1345, 656),
    Fraction::new_maybe_reduced(9097, 4242),
    Fraction::new_maybe_reduced(3542, 1577),
    Fraction::new_maybe_reduced(2476, 1051),
    Fraction::new_maybe_reduced(18828, 7607),
    Fraction::new_maybe_reduced(3173, 1218),
    Fraction::new_maybe_reduced(8443, 3073),
    Fraction::new_maybe_reduced(9035, 3111),
    Fraction::new_maybe_reduced(9667, 3141),
    Fraction::new_maybe_reduced(12233, 3740),
    Fraction::new_maybe_reduced(6790, 1947),
    Fraction::new_maybe_reduced(9513, 2549),
    Fraction::new_maybe_reduced(4833, 1205),
    Fraction::new_maybe_reduced(3881, 896),
    Fraction::new_maybe_reduced(9461, 2011),
    Fraction::new_maybe_reduced(3025, 588),
    Fraction::new_maybe_reduced(6142, 1083),
    Fraction::new_maybe_reduced(14307, 2266),
    Fraction::new_maybe_reduced(185, 26),
    Fraction::new_maybe_reduced(13145, 1614),
    Fraction::new_maybe_reduced(2978, 313),
    Fraction::new_maybe_reduced(12093, 1058),
    Fraction::new_maybe_reduced(28587, 1999),
    Fraction::new_maybe_reduced(3053, 160),
    Fraction::new_maybe_reduced(32216, 1125),
    Fraction::new_maybe_reduced(1776, 31),
    Fraction::new_whole(32767),
    Fraction::new_maybe_reduced(-25265, 441),
    Fraction::new_maybe_reduced(-7474, 261),
    Fraction::new_maybe_reduced(-29423, 1542),
    Fraction::new_maybe_reduced(-13271, 928),
    Fraction::new_maybe_reduced(-2206, 193),
    Fraction::new_maybe_reduced(-9267, 974),
    Fraction::new_maybe_reduced(-26917, 3305),
    Fraction::new_maybe_reduced(-11349, 1595),
    Fraction::new_maybe_reduced(-5373, 851),
    Fraction::new_maybe_reduced(-11507, 2029),
    Fraction::new_maybe_reduced(-17723, 3445),
    Fraction::new_maybe_reduced(-8139, 1730),
    Fraction::new_maybe_reduced(-10088, 2329),
    Fraction::new_maybe_reduced(-6325, 1577),
    Fraction::new_maybe_reduced(-1351, 362),
    Fraction::new_maybe_reduced(-1939, 556),
    Fraction::new_maybe_reduced(-6195, 1894),
    Fraction::new_maybe_reduced(-14659, 4763),
    Fraction::new_maybe_reduced(-2759, 950),
    Fraction::new_maybe_reduced(-24197, 8807),
    Fraction::new_maybe_reduced(-7375, 2831),
    Fraction::new_maybe_reduced(-3626, 1465),
    Fraction::new_maybe_reduced(-2476, 1051),
    Fraction::new_maybe_reduced(-7367, 3280),
    Fraction::new_maybe_reduced(-9097, 4242),
    Fraction::new_maybe_reduced(-7459, 3638),
    Fraction::new_maybe_reduced(-2467, 1257),
    Fraction::new_maybe_reduced(-2176, 1157),
    Fraction::new_maybe_reduced(-1961, 1087),
    Fraction::new_maybe_reduced(-1351, 780),
    Fraction::new_maybe_reduced(-1626, 977),
    Fraction::new_maybe_reduced(-3836, 2397),
    Fraction::new_maybe_reduced(-2955, 1919),
    Fraction::new_maybe_reduced(-2848, 1921),
    Fraction::new_maybe_reduced(-5307, 3716),
    Fraction::new_maybe_reduced(-1993, 1448),
    Fraction::new_maybe_reduced(-16178, 12191),
    Fraction::new_maybe_reduced(-2629, 2054),
    Fraction::new_maybe_reduced(-2555, 2069),
    Fraction::new_maybe_reduced(-1821, 1528),
    Fraction::new_maybe_reduced(-1247, 1084),
    Fraction::new_maybe_reduced(-1978, 1781),
    Fraction::new_maybe_reduced(-18656, 17397),
    Fraction::new_maybe_reduced(-1399, 1351),
    Fraction::new_whole(-1),
    Fraction::new_maybe_reduced(-2139, 2215),
    Fraction::new_maybe_reduced(-9037, 9691),
    Fraction::new_maybe_reduced(-3788, 4207),
    Fraction::new_maybe_reduced(-2301, 2647),
    Fraction::new_maybe_reduced(-2571, 3064),
    Fraction::new_maybe_reduced(-3559, 4395),
    Fraction::new_maybe_reduced(-2747, 3516),
    Fraction::new_maybe_reduced(-5990, 7949),
    Fraction::new_maybe_reduced(-1719, 2366),
    Fraction::new_maybe_reduced(-1691, 2415),
    Fraction::new_maybe_reduced(-1577, 2338),
    Fraction::new_maybe_reduced(-1041, 1603),
    Fraction::new_maybe_reduced(-598, 957),
    Fraction::new_maybe_reduced(-1117, 1859),
    Fraction::new_maybe_reduced(-1769, 3064),
    Fraction::new_maybe_reduced(-1235, 2228),
    Fraction::new_maybe_reduced(-1266, 2381),
    Fraction::new_maybe_reduced(-2006, 3937),
    Fraction::new_maybe_reduced(-1153, 2364),
    Fraction::new_maybe_reduced(-173, 371),
    Fraction::new_maybe_reduced(-1199, 2693),
    Fraction::new_maybe_reduced(-1273, 2999),
    Fraction::new_maybe_reduced(-1385, 3428),
    Fraction::new_maybe_reduced(-1532, 3991),
    Fraction::new_maybe_reduced(-99, 272),
    Fraction::new_maybe_reduced(-1211, 3517),
    Fraction::new_maybe_reduced(-708, 2179),
    Fraction::new_maybe_reduced(-827, 2705),
    Fraction::new_maybe_reduced(-755, 2633),
    Fraction::new_maybe_reduced(-989, 3691),
    Fraction::new_maybe_reduced(-371, 1488),
    Fraction::new_maybe_reduced(-359, 1555),
    Fraction::new_maybe_reduced(-281, 1322),
    Fraction::new_maybe_reduced(-671, 3452),
    Fraction::new_maybe_reduced(-505, 2864),
    Fraction::new_maybe_reduced(-596, 3763),
    Fraction::new_maybe_reduced(-1881, 13384),
    Fraction::new_maybe_reduced(-575, 4683),
    Fraction::new_maybe_reduced(-278, 2645),
    Fraction::new_maybe_reduced(-286, 3269),
    Fraction::new_maybe_reduced(-143, 2045),
    Fraction::new_maybe_reduced(-308, 5877),
    Fraction::new_maybe_reduced(-316, 9049),
    Fraction::new_maybe_reduced(-55, 3151),
];

pub static ARCTAN_TABLE: [Fraction; (ARCTAN_SUBDIVISIONS + 1) as usize] = [
    Fraction::new_whole(0),
    Fraction::new_maybe_reduced(1, 462),
    Fraction::new_maybe_reduced(1, 231),
    Fraction::new_maybe_reduced(1, 154),
    Fraction::new_maybe_reduced(113, 13052),
    Fraction::new_maybe_reduced(47, 4343),
    Fraction::new_maybe_reduced(199, 15324),
    Fraction::new_maybe_reduced(180, 11881),
    Fraction::new_maybe_reduced(41, 2368),
    Fraction::new_maybe_reduced(50, 2567),
    Fraction::new_maybe_reduced(82, 3789),
    Fraction::new_maybe_reduced(123, 5167),
    Fraction::new_maybe_reduced(57, 2195),
    Fraction::new_maybe_reduced(73, 2595),
    Fraction::new_maybe_reduced(98, 3235),
    Fraction::new_maybe_reduced(37, 1140),
    Fraction::new_maybe_reduced(97, 2802),
    Fraction::new_maybe_reduced(53, 1441),
    Fraction::new_maybe_reduced(103, 2645),
    Fraction::new_maybe_reduced(88, 2141),
    Fraction::new_maybe_reduced(166, 3837),
    Fraction::new_maybe_reduced(66, 1453),
    Fraction::new_maybe_reduced(63, 1324),
    Fraction::new_maybe_reduced(251, 5046),
    Fraction::new_maybe_reduced(101, 1946),
    Fraction::new_maybe_reduced(249, 4606),
    Fraction::new_maybe_reduced(250, 4447),
    Fraction::new_maybe_reduced(268, 4591),
    Fraction::new_maybe_reduced(198, 3271),
    Fraction::new_maybe_reduced(104, 1659),
    Fraction::new_maybe_reduced(185, 2853),
    Fraction::new_maybe_reduced(215, 3209),
    Fraction::new_maybe_reduced(241, 3485),
    Fraction::new_maybe_reduced(421, 5904),
    Fraction::new_maybe_reduced(173, 2355),
    Fraction::new_maybe_reduced(111, 1468),
    Fraction::new_maybe_reduced(135, 1736),
    Fraction::new_maybe_reduced(343, 4292),
    Fraction::new_maybe_reduced(394, 4801),
    Fraction::new_maybe_reduced(167, 1983),
    Fraction::new_maybe_reduced(330, 3821),
    Fraction::new_maybe_reduced(319, 3604),
    Fraction::new_maybe_reduced(397, 4379),
    Fraction::new_maybe_reduced(169, 1821),
    Fraction::new_maybe_reduced(363, 3823),
    Fraction::new_maybe_reduced(107, 1102),
    Fraction::new_maybe_reduced(222, 2237),
    Fraction::new_maybe_reduced(1041, 10268),
    Fraction::new_maybe_reduced(420, 4057),
    Fraction::new_maybe_reduced(235, 2224),
    Fraction::new_maybe_reduced(337, 3126),
    Fraction::new_maybe_reduced(178, 1619),
    Fraction::new_maybe_reduced(359, 3203),
    Fraction::new_maybe_reduced(886, 7757),
    Fraction::new_maybe_reduced(249, 2140),
    Fraction::new_maybe_reduced(339, 2861),
    Fraction::new_maybe_reduced(410, 3399),
    Fraction::new_maybe_reduced(212, 1727),
    Fraction::new_maybe_reduced(139, 1113),
    Fraction::new_maybe_reduced(535, 4212),
    Fraction::new_maybe_reduced(362, 2803),
    Fraction::new_maybe_reduced(421, 3207),
    Fraction::new_maybe_reduced(518, 3883),
    Fraction::new_maybe_reduced(140, 1033),
    Fraction::new_maybe_reduced(1447, 10512),
    Fraction::new_maybe_reduced(311, 2225),
    Fraction::new_maybe_reduced(549, 3869),
    Fraction::new_maybe_reduced(195, 1354),
    Fraction::new_maybe_reduced(331, 2265),
    Fraction::new_maybe_reduced(412, 2779),
    Fraction::new_maybe_reduced(506, 3365),
    Fraction::new_maybe_reduced(371, 2433),
    Fraction::new_maybe_reduced(331, 2141),
    Fraction::new_maybe_reduced(349, 2227),
    Fraction::new_maybe_reduced(1340, 8437),
    Fraction::new_maybe_reduced(131, 814),
    Fraction::new_maybe_reduced(1072, 6575),
    Fraction::new_maybe_reduced(272, 1647),
    Fraction::new_maybe_reduced(617, 3689),
    Fraction::new_maybe_reduced(472, 2787),
    Fraction::new_maybe_reduced(626, 3651),
    Fraction::new_maybe_reduced(407, 2345),
    Fraction::new_maybe_reduced(599, 3410),
    Fraction::new_maybe_reduced(195, 1097),
    Fraction::new_maybe_reduced(491, 2730),
    Fraction::new_maybe_reduced(510, 2803),
    Fraction::new_maybe_reduced(542, 2945),
    Fraction::new_maybe_reduced(1012, 5437),
    Fraction::new_maybe_reduced(799, 4245),
    Fraction::new_maybe_reduced(326, 1713),
    Fraction::new_maybe_reduced(673, 3498),
    Fraction::new_maybe_reduced(303, 1558),
    Fraction::new_maybe_reduced(183, 931),
    Fraction::new_maybe_reduced(293, 1475),
    Fraction::new_maybe_reduced(111, 553),
    Fraction::new_maybe_reduced(391, 1928),
    Fraction::new_maybe_reduced(689, 3363),
    Fraction::new_maybe_reduced(792, 3827),
    Fraction::new_maybe_reduced(644, 3081),
    Fraction::new_maybe_reduced(529, 2506),
    Fraction::new_maybe_reduced(962, 4513),
    Fraction::new_maybe_reduced(913, 4242),
    Fraction::new_maybe_reduced(676, 3111),
    Fraction::new_maybe_reduced(859, 3916),
    Fraction::new_maybe_reduced(428, 1933),
    Fraction::new_maybe_reduced(1247, 5580),
    Fraction::new_maybe_reduced(507, 2248),
    Fraction::new_maybe_reduced(523, 2298),
    Fraction::new_maybe_reduced(533, 2321),
    Fraction::new_maybe_reduced(829, 3578),
    Fraction::new_maybe_reduced(1179, 5044),
    Fraction::new_maybe_reduced(419, 1777),
    Fraction::new_maybe_reduced(655, 2754),
    Fraction::new_maybe_reduced(397, 1655),
    Fraction::new_maybe_reduced(262, 1083),
    Fraction::new_maybe_reduced(414, 1697),
    Fraction::new_maybe_reduced(169, 687),
    Fraction::new_maybe_reduced(1355, 5463),
    Fraction::new_maybe_reduced(959, 3835),
    Fraction::new_maybe_reduced(872, 3459),
    Fraction::new_maybe_reduced(1109, 4364),
    Fraction::new_maybe_reduced(406, 1585),
    Fraction::new_maybe_reduced(1121, 4342),
    Fraction::new_maybe_reduced(893, 3432),
    Fraction::new_maybe_reduced(617, 2353),
    Fraction::new_maybe_reduced(877, 3319),
    Fraction::new_maybe_reduced(471, 1769),
    Fraction::new_maybe_reduced(481, 1793),
    Fraction::new_maybe_reduced(1083, 4007),
    Fraction::new_maybe_reduced(617, 2266),
    Fraction::new_maybe_reduced(223, 813),
    Fraction::new_maybe_reduced(197, 713),
    Fraction::new_maybe_reduced(563, 2023),
    Fraction::new_maybe_reduced(636, 2269),
    Fraction::new_maybe_reduced(1676, 5937),
    Fraction::new_maybe_reduced(400, 1407),
    Fraction::new_maybe_reduced(501, 1750),
    Fraction::new_maybe_reduced(659, 2286),
    Fraction::new_maybe_reduced(811, 2794),
    Fraction::new_maybe_reduced(396, 1355),
    Fraction::new_maybe_reduced(148, 503),
    Fraction::new_maybe_reduced(681, 2299),
    Fraction::new_maybe_reduced(925, 3102),
    Fraction::new_maybe_reduced(1053, 3508),
    Fraction::new_maybe_reduced(662, 2191),
    Fraction::new_maybe_reduced(229, 753),
    Fraction::new_maybe_reduced(689, 2251),
    Fraction::new_maybe_reduced(723, 2347),
    Fraction::new_maybe_reduced(913, 2945),
    Fraction::new_maybe_reduced(711, 2279),
    Fraction::new_maybe_reduced(955, 3042),
    Fraction::new_maybe_reduced(1419, 4492),
    Fraction::new_maybe_reduced(739, 2325),
    Fraction::new_maybe_reduced(386, 1207),
    Fraction::new_maybe_reduced(1213, 3770),
    Fraction::new_maybe_reduced(851, 2629),
    Fraction::new_maybe_reduced(1256, 3857),
    Fraction::new_maybe_reduced(1861, 5681),
    Fraction::new_maybe_reduced(490, 1487),
    Fraction::new_maybe_reduced(1061, 3201),
    Fraction::new_maybe_reduced(1860, 5579),
    Fraction::new_maybe_reduced(1235, 3683),
    Fraction::new_maybe_reduced(717, 2126),
    Fraction::new_maybe_reduced(967, 2851),
    Fraction::new_maybe_reduced(600, 1759),
    Fraction::new_maybe_reduced(2407, 7017),
    Fraction::new_maybe_reduced(1347, 3905),
    Fraction::new_maybe_reduced(701, 2021),
    Fraction::new_maybe_reduced(979, 2807),
    Fraction::new_maybe_reduced(1570, 4477),
    Fraction::new_maybe_reduced(1178, 3341),
    Fraction::new_maybe_reduced(564, 1591),
    Fraction::new_maybe_reduced(989, 2775),
    Fraction::new_maybe_reduced(1043, 2911),
    Fraction::new_maybe_reduced(970, 2693),
    Fraction::new_maybe_reduced(340, 939),
    Fraction::new_maybe_reduced(483, 1327),
    Fraction::new_maybe_reduced(1267, 3463),
    Fraction::new_maybe_reduced(1973, 5365),
    Fraction::new_maybe_reduced(3007, 8135),
    Fraction::new_maybe_reduced(1307, 3518),
    Fraction::new_maybe_reduced(1833, 4909),
    Fraction::new_maybe_reduced(1906, 5079),
    Fraction::new_maybe_reduced(5125, 13589),
    Fraction::new_maybe_reduced(1098, 2897),
    Fraction::new_maybe_reduced(996, 2615),
    Fraction::new_maybe_reduced(3083, 8055),
    Fraction::new_maybe_reduced(2743, 7132),
    Fraction::new_maybe_reduced(2381, 6161),
    Fraction::new_maybe_reduced(1097, 2825),
    Fraction::new_maybe_reduced(1183, 3032),
    Fraction::new_maybe_reduced(1022, 2607),
    Fraction::new_maybe_reduced(1182, 3001),
    Fraction::new_maybe_reduced(1163, 2939),
    Fraction::new_maybe_reduced(1203, 3026),
    Fraction::new_maybe_reduced(921, 2306),
    Fraction::new_maybe_reduced(849, 2116),
    Fraction::new_maybe_reduced(3291, 8165),
    Fraction::new_maybe_reduced(1854, 4579),
    Fraction::new_maybe_reduced(569, 1399),
    Fraction::new_maybe_reduced(373, 913),
    Fraction::new_maybe_reduced(1069, 2605),
    Fraction::new_maybe_reduced(927, 2249),
    Fraction::new_maybe_reduced(763, 1843),
    Fraction::new_maybe_reduced(689, 1657),
    Fraction::new_maybe_reduced(583, 1396),
    Fraction::new_maybe_reduced(367, 875),
    Fraction::new_maybe_reduced(123, 292),
    Fraction::new_maybe_reduced(1135, 2683),
    Fraction::new_maybe_reduced(633, 1490),
    Fraction::new_maybe_reduced(1160, 2719),
    Fraction::new_maybe_reduced(404, 943),
    Fraction::new_maybe_reduced(863, 2006),
    Fraction::new_maybe_reduced(829, 1919),
    Fraction::new_maybe_reduced(940, 2167),
    Fraction::new_maybe_reduced(828, 1901),
    Fraction::new_maybe_reduced(506, 1157),
    Fraction::new_maybe_reduced(970, 2209),
    Fraction::new_maybe_reduced(977, 2216),
    Fraction::new_maybe_reduced(1675, 3784),
    Fraction::new_maybe_reduced(1947, 4381),
    Fraction::new_maybe_reduced(485, 1087),
    Fraction::new_maybe_reduced(3472, 7751),
    Fraction::new_maybe_reduced(523, 1163),
    Fraction::new_maybe_reduced(1367, 3028),
    Fraction::new_maybe_reduced(983, 2169),
    Fraction::new_maybe_reduced(712, 1565),
    Fraction::new_maybe_reduced(849, 1859),
    Fraction::new_maybe_reduced(1081, 2358),
    Fraction::new_maybe_reduced(2681, 5826),
    Fraction::new_maybe_reduced(1134, 2455),
    Fraction::new_maybe_reduced(1116, 2407),
    Fraction::new_maybe_reduced(1035, 2224),
    Fraction::new_maybe_reduced(5403, 11567),
    Fraction::new_maybe_reduced(1113, 2374),
    Fraction::new_maybe_reduced(1446, 3073),
    Fraction::new_maybe_reduced(860, 1821),
    Fraction::new_maybe_reduced(1585, 3344),
    Fraction::new_maybe_reduced(1967, 4135),
    Fraction::new_maybe_reduced(412, 863),
    Fraction::new_maybe_reduced(1594, 3327),
    Fraction::new_maybe_reduced(1466, 3049),
    Fraction::new_maybe_reduced(814, 1687),
    Fraction::new_maybe_reduced(13493, 27866),
    Fraction::new_maybe_reduced(1827, 3760),
    Fraction::new_maybe_reduced(1474, 3023),
    Fraction::new_maybe_reduced(662, 1353),
    Fraction::new_maybe_reduced(761, 1550),
    Fraction::new_maybe_reduced(1307, 2653),
    Fraction::new_maybe_reduced(1351, 2733),
    Fraction::new_maybe_reduced(931, 1877),
    Fraction::new_maybe_reduced(857, 1722),
    Fraction::new_maybe_reduced(1529, 3062),
    Fraction::new_maybe_reduced(1236, 2467),
    Fraction::new_maybe_reduced(845, 1681),
    Fraction::new_maybe_reduced(1279, 2536),
    Fraction::new_maybe_reduced(211, 417),
    Fraction::new_maybe_reduced(365, 719),
    Fraction::new_maybe_reduced(1013, 1989),
    Fraction::new_maybe_reduced(4713, 9224),
    Fraction::new_maybe_reduced(1282, 2501),
    Fraction::new_maybe_reduced(1517, 2950),
    Fraction::new_maybe_reduced(1121, 2173),
    Fraction::new_maybe_reduced(1315, 2541),
    Fraction::new_maybe_reduced(827, 1593),
    Fraction::new_maybe_reduced(1905, 3658),
    Fraction::new_maybe_reduced(2017, 3861),
    Fraction::new_maybe_reduced(229, 437),
    Fraction::new_maybe_reduced(1783, 3392),
    Fraction::new_maybe_reduced(1547, 2934),
    Fraction::new_maybe_reduced(1291, 2441),
    Fraction::new_maybe_reduced(1731, 3263),
    Fraction::new_maybe_reduced(1268, 2383),
    Fraction::new_maybe_reduced(6832, 12801),
    Fraction::new_maybe_reduced(2039, 3809),
    Fraction::new_maybe_reduced(1651, 3075),
    Fraction::new_maybe_reduced(902, 1675),
    Fraction::new_maybe_reduced(1495, 2768),
    Fraction::new_maybe_reduced(903, 1667),
    Fraction::new_maybe_reduced(772, 1421),
    Fraction::new_maybe_reduced(1342, 2463),
    Fraction::new_maybe_reduced(1153, 2110),
    Fraction::new_maybe_reduced(2191, 3998),
    Fraction::new_maybe_reduced(892, 1623),
    Fraction::new_maybe_reduced(1411, 2560),
    Fraction::new_maybe_reduced(1593, 2882),
    Fraction::new_maybe_reduced(3899, 7034),
    Fraction::new_maybe_reduced(1567, 2819),
    Fraction::new_maybe_reduced(1354, 2429),
    Fraction::new_maybe_reduced(2895, 5179),
    Fraction::new_maybe_reduced(1736, 3097),
    Fraction::new_maybe_reduced(1557, 2770),
    Fraction::new_maybe_reduced(1789, 3174),
    Fraction::new_maybe_reduced(815, 1442),
    Fraction::new_maybe_reduced(603, 1064),
    Fraction::new_maybe_reduced(745, 1311),
    Fraction::new_maybe_reduced(1253, 2199),
    Fraction::new_maybe_reduced(897, 1570),
    Fraction::new_maybe_reduced(1820, 3177),
    Fraction::new_maybe_reduced(166, 289),
    Fraction::new_maybe_reduced(1191, 2068),
    Fraction::new_maybe_reduced(645, 1117),
    Fraction::new_maybe_reduced(2933, 5066),
    Fraction::new_maybe_reduced(1302, 2243),
    Fraction::new_maybe_reduced(827, 1421),
    Fraction::new_maybe_reduced(2425, 4156),
    Fraction::new_maybe_reduced(5647, 9653),
    Fraction::new_maybe_reduced(1573, 2682),
    Fraction::new_maybe_reduced(892, 1517),
    Fraction::new_maybe_reduced(1673, 2838),
    Fraction::new_maybe_reduced(1273, 2154),
    Fraction::new_maybe_reduced(1829, 3087),
    Fraction::new_maybe_reduced(1084, 1825),
    Fraction::new_maybe_reduced(839, 1409),
    Fraction::new_maybe_reduced(2614, 4379),
    Fraction::new_maybe_reduced(757, 1265),
    Fraction::new_maybe_reduced(1144, 1907),
    Fraction::new_maybe_reduced(967, 1608),
    Fraction::new_maybe_reduced(2676, 4439),
    Fraction::new_maybe_reduced(1179, 1951),
    Fraction::new_maybe_reduced(8714, 14385),
    Fraction::new_maybe_reduced(739, 1217),
    Fraction::new_maybe_reduced(4077, 6698),
    Fraction::new_maybe_reduced(2069, 3391),
    Fraction::new_maybe_reduced(1888, 3087),
    Fraction::new_maybe_reduced(1795, 2928),
    Fraction::new_maybe_reduced(5249, 8542),
    Fraction::new_maybe_reduced(1631, 2648),
    Fraction::new_maybe_reduced(1144, 1853),
    Fraction::new_maybe_reduced(1013, 1637),
    Fraction::new_maybe_reduced(2089, 3368),
    Fraction::new_maybe_reduced(281, 452),
    Fraction::new_maybe_reduced(577, 926),
    Fraction::new_maybe_reduced(2693, 4312),
    Fraction::new_maybe_reduced(979, 1564),
    Fraction::new_maybe_reduced(857, 1366),
    Fraction::new_maybe_reduced(559, 889),
    Fraction::new_maybe_reduced(1527, 2423),
    Fraction::new_maybe_reduced(775, 1227),
    Fraction::new_maybe_reduced(2020, 3191),
    Fraction::new_maybe_reduced(748, 1179),
    Fraction::new_maybe_reduced(9577, 15062),
    Fraction::new_maybe_reduced(1126, 1767),
    Fraction::new_maybe_reduced(1048, 1641),
    Fraction::new_maybe_reduced(889, 1389),
    Fraction::new_maybe_reduced(2837, 4423),
    Fraction::new_maybe_reduced(1877, 2920),
    Fraction::new_maybe_reduced(1653, 2566),
    Fraction::new_maybe_reduced(1306, 2023),
    Fraction::new_maybe_reduced(1105, 1708),
    Fraction::new_maybe_reduced(2546, 3927),
    Fraction::new_maybe_reduced(1545, 2378),
    Fraction::new_maybe_reduced(1935, 2972),
    Fraction::new_maybe_reduced(1361, 2086),
    Fraction::new_maybe_reduced(695, 1063),
    Fraction::new_maybe_reduced(19, 29),
    Fraction::new_maybe_reduced(1382, 2105),
    Fraction::new_maybe_reduced(2773, 4215),
    Fraction::new_maybe_reduced(3463, 5253),
    Fraction::new_maybe_reduced(1269, 1921),
    Fraction::new_maybe_reduced(1541, 2328),
    Fraction::new_maybe_reduced(1243, 1874),
    Fraction::new_maybe_reduced(870, 1309),
    Fraction::new_maybe_reduced(955, 1434),
    Fraction::new_maybe_reduced(1739, 2606),
    Fraction::new_maybe_reduced(2936, 4391),
    Fraction::new_maybe_reduced(3041, 4539),
    Fraction::new_maybe_reduced(821, 1223),
    Fraction::new_maybe_reduced(602, 895),
    Fraction::new_maybe_reduced(1234, 1831),
    Fraction::new_maybe_reduced(4841, 7169),
    Fraction::new_maybe_reduced(2069, 3058),
    Fraction::new_maybe_reduced(1227, 1810),
    Fraction::new_maybe_reduced(1552, 2285),
    Fraction::new_maybe_reduced(1932, 2839),
    Fraction::new_maybe_reduced(3313, 4859),
    Fraction::new_maybe_reduced(2531, 3705),
    Fraction::new_maybe_reduced(2119, 3096),
    Fraction::new_maybe_reduced(1283, 1871),
    Fraction::new_maybe_reduced(2711, 3946),
    Fraction::new_maybe_reduced(1632, 2371),
    Fraction::new_maybe_reduced(491, 712),
    Fraction::new_maybe_reduced(827, 1197),
    Fraction::new_maybe_reduced(2053, 2966),
    Fraction::new_maybe_reduced(880, 1269),
    Fraction::new_maybe_reduced(4661, 6709),
    Fraction::new_maybe_reduced(1170, 1681),
    Fraction::new_maybe_reduced(2725, 3908),
    Fraction::new_maybe_reduced(533, 763),
    Fraction::new_maybe_reduced(1611, 2302),
    Fraction::new_maybe_reduced(835, 1191),
    Fraction::new_maybe_reduced(925, 1317),
    Fraction::new_maybe_reduced(2317, 3293),
    Fraction::new_maybe_reduced(246, 349),
    Fraction::new_maybe_reduced(1026, 1453),
    Fraction::new_maybe_reduced(863, 1220),
    Fraction::new_maybe_reduced(1109, 1565),
    Fraction::new_maybe_reduced(1172, 1651),
    Fraction::new_maybe_reduced(2885, 4057),
    Fraction::new_maybe_reduced(1689, 2371),
    Fraction::new_maybe_reduced(887, 1243),
    Fraction::new_maybe_reduced(935, 1308),
    Fraction::new_maybe_reduced(2242, 3131),
    Fraction::new_maybe_reduced(1464, 2041),
    Fraction::new_maybe_reduced(1090, 1517),
    Fraction::new_maybe_reduced(1374, 1909),
    Fraction::new_maybe_reduced(1633, 2265),
    Fraction::new_maybe_reduced(1305, 1807),
    Fraction::new_maybe_reduced(3319, 4588),
    Fraction::new_maybe_reduced(1492, 2059),
    Fraction::new_maybe_reduced(1607, 2214),
    Fraction::new_maybe_reduced(2035, 2799),
    Fraction::new_maybe_reduced(1825, 2506),
    Fraction::new_maybe_reduced(2672, 3663),
    Fraction::new_maybe_reduced(2786, 3813),
    Fraction::new_maybe_reduced(2612, 3569),
    Fraction::new_maybe_reduced(1925, 2626),
    Fraction::new_maybe_reduced(1177, 1603),
    Fraction::new_maybe_reduced(1187, 1614),
    Fraction::new_maybe_reduced(909, 1234),
    Fraction::new_maybe_reduced(439, 595),
    Fraction::new_maybe_reduced(2200, 2977),
    Fraction::new_maybe_reduced(1809, 2444),
    Fraction::new_maybe_reduced(622, 839),
    Fraction::new_maybe_reduced(2437, 3282),
    Fraction::new_maybe_reduced(1123, 1510),
    Fraction::new_maybe_reduced(1673, 2246),
    Fraction::new_maybe_reduced(708, 949),
    Fraction::new_maybe_reduced(1073, 1436),
    Fraction::new_maybe_reduced(1615, 2158),
    Fraction::new_maybe_reduced(2439, 3254),
    Fraction::new_maybe_reduced(807, 1075),
    Fraction::new_maybe_reduced(1521, 2023),
    Fraction::new_maybe_reduced(939, 1247),
    Fraction::new_maybe_reduced(1859, 2465),
    Fraction::new_maybe_reduced(1957, 2591),
    Fraction::new_maybe_reduced(1817, 2402),
    Fraction::new_maybe_reduced(1097, 1448),
    Fraction::new_maybe_reduced(1563, 2060),
    Fraction::new_maybe_reduced(1231, 1620),
    Fraction::new_maybe_reduced(1503, 1975),
    Fraction::new_maybe_reduced(1051, 1379),
    Fraction::new_maybe_reduced(3679, 4820),
    Fraction::new_maybe_reduced(451, 590),
    Fraction::new_maybe_reduced(2994, 3911),
    Fraction::new_maybe_reduced(2681, 3497),
    Fraction::new_maybe_reduced(1749, 2278),
    Fraction::new_maybe_reduced(2665, 3466),
    Fraction::new_maybe_reduced(3626, 4709),
    Fraction::new_maybe_reduced(2281, 2958),
    Fraction::new_maybe_reduced(2526, 3271),
    Fraction::new_maybe_reduced(1805, 2334),
    Fraction::new_maybe_reduced(1607, 2075),
    Fraction::new_maybe_reduced(1517, 1956),
    Fraction::new_maybe_reduced(1318, 1697),
    Fraction::new_maybe_reduced(6555, 8428),
    Fraction::new_maybe_reduced(2314, 2971),
    Fraction::new_maybe_reduced(1471, 1886),
    Fraction::new_maybe_reduced(2201, 2818),
    Fraction::new_maybe_reduced(1454, 1859),
    Fraction::new_maybe_reduced(2251, 2874),
    Fraction::new_maybe_reduced(13091, 16691),
    Fraction::new_maybe_reduced(355, 452),
];