oILAB
Loading...
Searching...
No Matches
Farey.cpp
Go to the documentation of this file.
1#include "../../include/Math/Farey.h"
2
3namespace oILAB {
4// Function to generate the Farey sequence up to a given limit
5std::vector<std::pair<int, int>> farey(int limit, const bool firstQuadrant) {
6 std::vector<Fraction> pend;
7 std::vector<std::pair<int, int>> output;
8 int n = 0;
9 int d = 1;
10 int N = 1;
11 int D = 1;
12 while (true) {
13 int mediant_d = d + D;
14 if (mediant_d <= limit) {
15 int mediant_n = n + N;
16 pend.emplace_back(Fraction(mediant_n, mediant_d, N, D));
17 N = mediant_n;
18 D = mediant_d;
19 } else {
20 output.emplace_back(n, d);
21 if (firstQuadrant == false) {
22 if (n != 0)
23 output.emplace_back(-n, d);
24 if (d != 0)
25 output.emplace_back(n, -d);
26 if (n != 0 && d != 0)
27 output.emplace_back(-n, -d);
28 output.emplace_back(d, n);
29 if (n != 0)
30 output.emplace_back(d, -n);
31 if (d != 0)
32 output.emplace_back(-d, n);
33 if (n != 0 && d != 0)
34 output.emplace_back(-d, -n);
35 }
36 if (pend.empty()) {
37 break;
38 }
39 Fraction frac = pend.back();
40 pend.pop_back();
41 n = frac.n;
42 d = frac.d;
43 N = frac.N;
44 D = frac.D;
45 }
46 }
47 output.emplace_back(1, 1);
48 return output;
49 }
50 } // namespace oILAB
std::vector< std::pair< int, int > > farey(int limit, const bool firstQuadrant)
Definition Farey.cpp:5