add junk posts
This commit is contained in:
111
junk/faulhaber/faulhaber.js
Normal file
111
junk/faulhaber/faulhaber.js
Normal 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
1079
junk/faulhaber/index.html
Normal file
File diff suppressed because it is too large
Load Diff
1166
junk/sieves/index.html
Normal file
1166
junk/sieves/index.html
Normal file
File diff suppressed because it is too large
Load Diff
222
junk/sieves/sieves.js
Normal file
222
junk/sieves/sieves.js
Normal 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())
|
||||||
33
styles/faulhaber.css
Normal file
33
styles/faulhaber.css
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#demo-inputs {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#limit-label,
|
||||||
|
#exponent-label {
|
||||||
|
text-align: end;
|
||||||
|
}
|
||||||
|
|
||||||
|
#enter {
|
||||||
|
grid-column: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#result {
|
||||||
|
word-break: break-all;
|
||||||
|
max-height: 24lh;
|
||||||
|
overflow: auto;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
#stirling-result {
|
||||||
|
margin: 1vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* table styling */
|
||||||
|
caption {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
47
styles/junk.css
Normal file
47
styles/junk.css
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
.math-block {
|
||||||
|
overflow-x: auto;
|
||||||
|
overflow-y: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
overflow: auto;
|
||||||
|
background-color: black;
|
||||||
|
color: lime;
|
||||||
|
padding: 1ch;
|
||||||
|
border: 1vh solid gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
hgroup p {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
figcaption {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footnote-list {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* table styling */
|
||||||
|
table {
|
||||||
|
display: block;
|
||||||
|
overflow: auto;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
caption {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody {
|
||||||
|
border: 2px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
background-color: mediumturquoise;
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
border: 1px solid black;
|
||||||
|
}
|
||||||
26
styles/sieves.css
Normal file
26
styles/sieves.css
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/* demo styling */
|
||||||
|
#demo-inputs {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
text-align: end;
|
||||||
|
}
|
||||||
|
|
||||||
|
#enter {
|
||||||
|
grid-column: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#result {
|
||||||
|
margin: 1vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* table styling */
|
||||||
|
#result-caption {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user