Skip to content

Commit ec12912

Browse files
committed
Some more code samples for ch2
1 parent d1c6d4d commit ec12912

File tree

3 files changed

+159
-0
lines changed

3 files changed

+159
-0
lines changed

ch2-distance.cpp

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include <iostream>
2+
#include "my_intrinsics.h"
3+
#include "my_type_functions.h"
4+
5+
using namespace std;
6+
7+
template<typename F>
8+
requires(Transformation(F))
9+
DistanceType(F) distance(Domain(F) x, Domain(F) y, F f)
10+
{
11+
typedef DistanceType(F) N;
12+
N n = N(0);
13+
while (x != y) {
14+
x = f(x);
15+
n = n + N(1);
16+
}
17+
return n;
18+
}
19+
20+
int increment(int x) {
21+
return x + 1;
22+
}
23+
24+
int main() {
25+
cout << distance(0, 2, increment) << endl;
26+
}

ch2-orbit_structure.cpp

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
#include <iostream>
2+
#include <set>
3+
#include "my_intrinsics.h"
4+
#include "my_type_functions.h"
5+
6+
using namespace std;
7+
8+
template<typename F, typename P>
9+
requires(Transformation(F) && UnaryPredicate(P) &&
10+
Domain(F) == Domain(P))
11+
Domain(F) connection_point_naive(Domain(F) x, F f, P p)
12+
{
13+
set<Domain(F)> seen;
14+
while (p(x) && seen.find(x) == seen.end()) {
15+
seen.insert(x);
16+
x = f(x);
17+
}
18+
return x;
19+
}
20+
21+
template<typename F, typename P>
22+
requires(Transformation(F) && UnaryPredicate(P) &&
23+
Domain(F) == Domain(P))
24+
Domain(F) collision_point(const Domain(F)& x, F f, P p)
25+
{
26+
// Preconditions:
27+
// - p(x) if and only if f(x) is defined
28+
if (!p(x)) return x;
29+
30+
Domain(F) slow = x; // slow = f^0(x)
31+
Domain(F) fast = f(x); // fast = f^1(x)
32+
// n <- 0 (completed iterations)
33+
while (fast != slow) { // slow = f^n(x) ^ fast = f^{2n+1}(x)
34+
slow = f(slow); // slow = f^{n+1}(x) ^ fast = f^{2n+3}(x)
35+
if (!p(fast)) return fast;
36+
fast = f(fast); // slow = f^n(x) ^ fast = f^{2n+2}(x)
37+
if (!p(fast)) return fast;
38+
fast = f(fast); // slow = f^n(x) ^ fast = f^{2n+3}(x)
39+
// n <- n + 1
40+
}
41+
return fast; // slow = f^n(x) ^ fast = f^{2n+1}(x)
42+
// Postconditions:
43+
// - return value is terminal point or collision point
44+
}
45+
46+
template<typename F, typename P>
47+
requires(Transformation(F) && UnaryPredicate(P) &&
48+
Domain(F) == Domain(P))
49+
bool terminating(const Domain(F)& x, F f, P p)
50+
{
51+
// Preconditions:
52+
// - p(x) if and only if f(x) is defined
53+
return !p(collision_point(x, f, p));
54+
}
55+
56+
template<typename F>
57+
requires(Transformation(F))
58+
Domain(F)
59+
collision_point_nonterminating_orbit(const Domain(F)& x, F f)
60+
{
61+
Domain(F) slow = x; // slow = f^0(x)
62+
Domain(F) fast = f(x); // fast = f^1(x)
63+
// n <- 0 (completed iterations)
64+
while (fast != slow) { // slow = f^n(x) ^ fast = f^{2n+1}(x)
65+
slow = f(slow); // slow = f^{n+1}(x) ^ fast = f^{2n+1}(x)
66+
fast = f(fast); // slow = f^{n+1}(x) ^ fast = f^{2n+2}(x)
67+
fast = f(fast); // slow = f^{n+1}(x) ^ fast = f^{2n+3}(x)
68+
// n <- n + 1
69+
}
70+
return fast; // slow = f^n(x) ^ fast = f^{2n+1}(x)
71+
// Postconditions:
72+
// - return value is collision point
73+
}
74+
75+
template<int modulus>
76+
int mod_increment(int x)
77+
{
78+
return (x + 1) % modulus;
79+
}
80+
81+
template<int modulus>
82+
bool mod_valid(int x)
83+
{
84+
return x >= 0 && x < modulus;
85+
}
86+
87+
int main() {
88+
cout << collision_point(0, mod_increment<13>, mod_valid<13>) << endl;
89+
cout << collision_point_nonterminating_orbit(0, mod_increment<13>) << endl;
90+
}

ch2-power_unary.cpp

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include <iostream>
2+
#include <sstream>
3+
#include <string>
4+
#include "my_intrinsics.h"
5+
#include "my_type_functions.h"
6+
7+
using namespace std;
8+
9+
template<typename F, typename N>
10+
requires(Transformation(F) && Integer(N))
11+
Domain(F) power_unary(Domain(F) x, N n, F f)
12+
{
13+
// Preconditions:
14+
// - n >= 0
15+
// - (forall i in N) 0 < i <= n implies f^i(x) is defined
16+
while (n > N(0)) {
17+
x = f(x);
18+
n = n - N(1);
19+
}
20+
return x;
21+
}
22+
23+
string heighway_dragon_step(string input) {
24+
stringstream appender;
25+
for (int i = 0; i < input.length(); i++) {
26+
switch(input[i]) {
27+
case 'a':
28+
appender << "aRbFR";
29+
break;
30+
case 'b':
31+
appender << "LFaLb";
32+
break;
33+
default:
34+
appender << input[i];
35+
}
36+
}
37+
return appender.str();
38+
}
39+
40+
int main() {
41+
cout << power_unary("Fa", 10, heighway_dragon_step).length() << endl;
42+
}
43+

0 commit comments

Comments
 (0)