add junk posts

This commit is contained in:
filifa
2026-04-15 18:15:08 -04:00
parent 052b22a477
commit 9e5ee71efc
7 changed files with 2684 additions and 0 deletions

111
junk/faulhaber/faulhaber.js Normal file
View File

@@ -0,0 +1,111 @@
/*
* Copyright (C) 2026 filifa
*
* License: 0BSD (https://spdx.org/licenses/0BSD.html)
*/
let exp = null;
let s = null;
function stirling2(p) {
if (p === 0) {
return [1n];
}
let s = [0n];
for (let i = 1; i < p + 1; i++) {
s.push(1n);
for (let j = i - 1; j > 0; j--) {
s[j] = BigInt(j) * s[j] + s[j-1];
}
}
return s;
}
function faulhaber(n, s) {
const limit = BigInt(s.length);
if (limit === 1n) {
return n;
}
let q = n + 1n;
let total = 0n;
for (let k = 1n; k < limit; k++) {
q *= n + 1n - k;
total += s[k] * q / (k + 1n);
}
return total;
}
function calculate() {
const limit = document.querySelector("#limit");
const exponent = document.querySelector("#exponent");
const e = parseInt(exponent.value)
if (exp === null || exp !== e) {
exp = e;
s = stirling2(exp);
}
const n = BigInt(limit.value);
const r = faulhaber(n, s);
const result = document.querySelector("#result");
result.value = r;
}
function calculateStirling() {
const limit = document.querySelector("#stirling-limit");
const p = parseInt(limit.value)
s = stirling2(p);
const table = buildTable(s);
const result = document.querySelector("#stirling-result");
while (result.firstChild) {
result.removeChild(result.firstChild);
}
result.appendChild(table);
}
function buildTable(values) {
const table = document.createElement("table");
const caption = document.createElement("caption");
caption.textContent = "Stirling numbers S(p,k) from k=0 to k=p";
table.appendChild(caption);
const tbody = document.createElement("tbody");
table.appendChild(tbody);
const n = values.length;
const ks = Array(n);
for (let i = 0; i < n; i++) {
ks[i] = i;
}
const nrow = buildRow("k", ks);
tbody.appendChild(nrow);
const vrow = buildRow("S(p,k)", values);
tbody.appendChild(vrow);
return table;
}
function buildRow(htext, values) {
const row = document.createElement("tr");
const head = document.createElement("th");
head.textContent = htext;
row.appendChild(head);
const n = values.length;
for (let i = 0; i < n; i++) {
const elem = document.createElement("td");
elem.textContent = values[i];
row.appendChild(elem);
}
return row;
}
document.querySelector("#enter").addEventListener("click", () => calculate())
document.querySelector("#stirling-enter").addEventListener("click", () => calculateStirling())

1079
junk/faulhaber/index.html Normal file

File diff suppressed because it is too large Load Diff

1166
junk/sieves/index.html Normal file

File diff suppressed because it is too large Load Diff

222
junk/sieves/sieves.js Normal file
View File

@@ -0,0 +1,222 @@
/*
* Copyright (C) 2026 filifa
*
* License: 0BSD (https://spdx.org/licenses/0BSD.html)
*/
function sievePrimes(n) {
const isPrime = Array(n);
isPrime[0] = false;
isPrime[1] = false;
for (let i = 2; i < n; i++) {
isPrime[i] = true;
}
for (let i = 2; i < Math.sqrt(n); i++) {
if (!isPrime[i]) {
continue;
}
for (let j = i * i; j < n; j += i) {
isPrime[j] = false;
}
}
return isPrime;
}
function numDivisors(p, k) {
return k + 1;
}
function sumDivisors(p, k) {
return (p**(k+1) - 1) / (p - 1)
}
function totient(p, k) {
return p**(k-1) * (p - 1);
}
function radical(p, k) {
return p;
}
function littleOmega(p, k) {
return 1;
}
function bigOmega(p, k) {
return k;
}
function mobius(p, k) {
if (k === 1) {
return -1;
}
return 0;
}
function initArrays(l, r, additive) {
const sieve = Array(r - l);
const quo = Array(r - l);
for (let i = 0; i < r-l; i++) {
quo[i] = l + i;
if (additive) {
sieve[i] = 0;
} else {
sieve[i] = 1;
}
}
return [sieve, quo];
}
function sieveSegment(l, r, f, primes, additive) {
const [sieve, quo] = initArrays(l, r, additive);
for (let i = 0; i < primes.length; i++) {
if (i*i > r) {
break;
}
if (!primes[i]) {
continue;
}
sievePowers(i, l, r, f, sieve, quo, additive);
}
unusuals(f, sieve, quo, additive);
return sieve;
}
function unusuals(f, sieve, quo, additive) {
for (let i = 0; i < quo.length; i++) {
const q = quo[i];
if (q === 1) {
continue;
}
if (additive) {
sieve[i] += f(q, 1);
} else {
sieve[i] *= f(q, 1);
}
}
}
function sievePowers(p, l, r, f, sieve, quo, additive) {
let i = 1;
for (let q = p; q < r; q *= p) {
const y = f(p, i);
sieveMultiples(p, q, l, r, y, sieve, quo, additive);
i++;
}
}
function sieveMultiples(p, q, l, r, y, sieve, quo, additive) {
const low = Math.ceil(l / q);
for (let i = low * q; i < r; i += q) {
if (i % (p*q) === 0) {
continue;
}
if (additive) {
sieve[i - l] += y;
} else {
sieve[i - l] *= y;
}
quo[i - l] /= q
}
}
function getFunc(func) {
switch (func.value) {
case "num-divisors":
return [numDivisors, false];
case "sum-divisors":
return [sumDivisors, false];
case "totient":
return [totient, false];
case "mobius":
return [mobius, false];
case "radical":
return [radical, false];
case "little-omega":
return [littleOmega, true];
case "big-omega":
return [bigOmega, true];
default:
throw new Error("function not implemented!");
}
}
function buildTable(l, r, values) {
const table = document.createElement("table");
const caption = document.createElement("caption");
caption.id = "result-caption";
caption.textContent = "Results";
table.appendChild(caption);
const tbody = document.createElement("tbody");
table.appendChild(tbody);
const ns = Array(r-l);
for (let i = l; i < r; i++) {
ns[i - l] = i;
}
const nrow = buildRow("n", l, r, ns);
tbody.appendChild(nrow);
const vrow = buildRow("f(n)", l, r, values);
tbody.appendChild(vrow);
return table;
}
function buildRow(htext, l, r, values) {
const row = document.createElement("tr");
const head = document.createElement("th");
head.textContent = htext;
row.appendChild(head);
for (let i = l; i < r; i++) {
if (i === 0) {
continue;
}
const elem = document.createElement("td");
elem.textContent = values[i - l];
row.appendChild(elem);
}
return row;
}
function calculate() {
const lower = document.querySelector("#lower");
const upper = document.querySelector("#upper");
const func = document.querySelector("#function");
const [f, additive] = getFunc(func);
const l = parseInt(lower.value);
const r = parseInt(upper.value);
const s = Math.floor(Math.sqrt(r));
const primes = sievePrimes(s + 1);
const sieve = sieveSegment(l, r, f, primes, additive);
const table = buildTable(l, r, sieve);
const result = document.querySelector("#result");
while (result.firstChild) {
result.removeChild(result.firstChild);
}
result.appendChild(table);
}
document.querySelector("#enter").addEventListener("click", () => calculate())