summaryrefslogtreecommitdiffhomepage
path: root/misc/examples/triples.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/examples/triples.c')
-rw-r--r--misc/examples/triples.c55
1 files changed, 29 insertions, 26 deletions
diff --git a/misc/examples/triples.c b/misc/examples/triples.c
index 520bf012..9f2fcc1e 100644
--- a/misc/examples/triples.c
+++ b/misc/examples/triples.c
@@ -3,12 +3,21 @@
#include <stc/algo/coroutine.h>
#include <stdio.h>
+int gcd(int a, int b) {
+ while (b) {
+ int t = a % b;
+ a = b;
+ b = t;
+ }
+ return a;
+}
+
void triples_vanilla(int n) {
- for (int c = 5; n; ++c) {
+ for (int c = 5, i = 0; n; ++c) {
for (int a = 1; a < c; ++a) {
for (int b = a + 1; b < c; ++b) {
- if ((int64_t)a*a + (int64_t)b*b == (int64_t)c*c) {
- printf("{%d, %d, %d}\n", a, b, c);
+ if ((int64_t)a*a + (int64_t)b*b == (int64_t)c*c && gcd(a, b) == 1) {
+ printf("%d: {%d, %d, %d}\n", ++i, a, b, c);
if (--n == 0) goto done;
}
}
@@ -18,47 +27,41 @@ void triples_vanilla(int n) {
}
struct triples {
- int n;
+ int size, count;
int a, b, c;
int cco_state;
};
-bool triples_next(struct triples* I) {
- cco_begin(I);
- for (I->c = 5; I->n; ++I->c) {
- for (I->a = 1; I->a < I->c; ++I->a) {
- for (I->b = I->a + 1; I->b < I->c; ++I->b) {
- if ((int64_t)I->a*I->a + (int64_t)I->b*I->b == (int64_t)I->c*I->c) {
- cco_yield(true);
- if (--I->n == 0) cco_return;
+int triples_coro(struct triples* t) {
+ cco_routine(t) {
+ t->count = 0;
+ for (t->c = 5; t->size; ++t->c) {
+ for (t->a = 1; t->a < t->c; ++t->a) {
+ for (t->b = t->a + 1; t->b < t->c; ++t->b) {
+ if ((int64_t)t->a*t->a + (int64_t)t->b*t->b == (int64_t)t->c*t->c) {
+ if (t->count++ == t->size)
+ cco_return;
+ cco_yield();
}
}
}
}
- cco_final:
+ cco_cleanup:
puts("done");
- cco_end(false);
-}
-
-int gcd(int a, int b) {
- while (b) {
- int t = a % b;
- a = b;
- b = t;
}
- return a;
+ return 0;
}
-int main()
+int main(void)
{
puts("Vanilla triples:");
- triples_vanilla(6);
+ triples_vanilla(5);
puts("\nCoroutine triples:");
- struct triples t = {INT32_MAX};
+ struct triples t = {.size=INT32_MAX};
int n = 0;
- while (triples_next(&t)) {
+ while (triples_coro(&t)) {
if (gcd(t.a, t.b) > 1)
continue;
if (t.c < 100)