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