summaryrefslogtreecommitdiff
path: root/html/toys/godel/js/godel-worker.js
diff options
context:
space:
mode:
authorElizabeth Alexander Hunt <me@liz.coffee>2026-07-05 12:42:44 -0700
committerElizabeth Alexander Hunt <me@liz.coffee>2026-07-05 12:42:44 -0700
commit94b912b649150b9863a62096ba4740b2cc8ad21a (patch)
tree1882236fc980fa5946d3089a2f2e4670f3a70580 /html/toys/godel/js/godel-worker.js
parentab0ddcaeb1fc37351d14b89100e07d3a343ba9e1 (diff)
downloadlizdotcoffee-94b912b649150b9863a62096ba4740b2cc8ad21a.tar.gz
lizdotcoffee-94b912b649150b9863a62096ba4740b2cc8ad21a.zip
Factor
Diffstat (limited to 'html/toys/godel/js/godel-worker.js')
-rw-r--r--html/toys/godel/js/godel-worker.js42
1 files changed, 42 insertions, 0 deletions
diff --git a/html/toys/godel/js/godel-worker.js b/html/toys/godel/js/godel-worker.js
new file mode 100644
index 0000000..1ba9da4
--- /dev/null
+++ b/html/toys/godel/js/godel-worker.js
@@ -0,0 +1,42 @@
+const isPrime = (n) => {
+ if (n < 2) {
+ return false;
+ }
+ if (n === 2) {
+ return true;
+ }
+ if (n % 2 === 0) {
+ return false;
+ }
+ const limit = Math.floor(Math.sqrt(n));
+ for (let i = 3; i <= limit; i += 2) {
+ if (n % i === 0) {
+ return false;
+ }
+ }
+ return true;
+};
+
+const primes = [2];
+const primeAt = (index) => {
+ while (primes.length < index) {
+ let candidate = primes[primes.length - 1] + 1;
+ while (!isPrime(candidate)) {
+ candidate += 1;
+ }
+ primes.push(candidate);
+ }
+ return primes[index - 1];
+};
+
+const computeGodelNumber = (sequence) => {
+ return sequence.reduce((acc, exponent, idx) => {
+ const prime = BigInt(primeAt(idx + 1));
+ return acc * prime ** BigInt(exponent);
+ }, BigInt(1)) - BigInt(1);
+};
+
+self.addEventListener("message", (event) => {
+ const result = computeGodelNumber(event.data);
+ self.postMessage(result.toString());
+});