Public
Edited
Sep 4, 2024
Importers
Insert cell
Insert cell
Insert cell
function groupValues(map) {
let result = {};
for (let [key, value] of Object.entries(map)) {
if (!result[value]) {
result[value] = [];
}
result[value].push(key);
}
return result;
}
Insert cell
distinctPartitions(100)
Insert cell
function distinctPartitions(n, min = 1) {
let parts = [];
let getParts = (n, prev, min) => {
if (min === n) {
parts.push([...prev, min]);
return;
} else if (min > n) {
return;
} else {
getParts(n, prev, min + 1);
getParts(n - min, [...prev, min], min + 1);
}
};
getParts(n, [], min);
return parts;
}
Insert cell
function factors(n) {
let factors = [1];
let bigFactors = [];
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
factors.push(i);
if (i ** 2 !== n) {
bigFactors.push(n / i);
}
}
}
bigFactors.reverse();
return factors.concat(bigFactors);
}
Insert cell
// Factors of all numbers 1..n
// https://stackoverflow.com/a/62698812
function primeFactors(n) {
let facts = [[], []];
let rems = _.range(0, n);
for (let i = 2; i < Math.sqrt(n) + 1; i++) {
if (!facts[i]) {
for (let j = 2 * i; j < n; j += i) {
if (!facts[j]) {
facts[j] = [];
}
for (let k = rems[j]; k % i == 0; k /= i) {
facts[j].push(i);
rems[j] /= i;
}
}
}
}
for (let i = 2; i < n; i++) {
if (!facts[i]) {
facts[i] = [i];
} else if (rems[i] > 1) {
facts[i].push(rems[i]);
}
}
return facts;
}
Insert cell
function totients(limit) {
let sieve_limit = Math.floor(Math.sqrt(limit));
let spf = _.range(limit + 1).map((p) => (p % 2 == 0 ? 2 : p));
for (let p of _.range(3, sieve_limit + 1, 2)) {
for (let m of _.range(p * p, limit + 1, 2 * p)) {
if (spf[m] === m) {
spf[m] = p;
}
}
}
let phis = [0, 1];
for (let n of _.range(2, limit + 1)) {
if (spf[n] === n) {
phis.push(n - 1);
} else {
let p = spf[n];
let m = n / p;
let factor = spf[m] === p ? p : p - 1;
phis.push(phis[m] * factor);
}
}
return phis;
}
Insert cell
Insert cell
phi = (1 + Math.sqrt(5)) / 2
Insert cell
goldenAngle = (2 * Math.PI) / phi ** 2
Insert cell
Plot.plot({
width: 600,
height: 600,
marks: [
Plot.link(
getPrimes(2 ** 10).map((p) => {
return {
p: Math.log(p),
angle: ((p - 2) / 2) * goldenAngle
};
}),
{
stroke: "black",
x1: 0,
y1: 0,
opacity: (d) => 1 / Math.sqrt(2 * d.p),
x2: (d) => d.p * Math.cos(d.angle),
y2: (d) => d.p * Math.sin(d.angle)
}
)
]
})
Insert cell
{
const panzoom = vl
.selectInterval()
.bind("scales")
.translate(
"[mousedown[!event.shiftKey], window:mouseup] > window:mousemove!"
)
.zoom("wheel!");

const brush = vl
.selectInterval()
.resolve("union")
.on("[mousedown[event.shiftKey], window:mouseup] > window:mousemove!")
.translate(
"[mousedown[event.shiftKey], window:mouseup] > window:mousemove!"
)
.zoom(null);
return vl
.markPoint()
.params(panzoom, brush)
.width(1000)
.data(primesWithIndex)
.encode(vl.x().fieldQ("index"), vl.y().fieldQ("value"))
.render();
}
Insert cell
vl
.markPoint()
.width(1000)
.data(primeDiffs)
.encode(vl.x().fieldQ("index"), vl.y().fieldQ("diff"))
.render()
Insert cell
primeDiffs = {
const diffs = []
for (let i = 0; i < primes.length - 1; i++) {
diffs.push({ index: i, diff: primes[i+1] - primes[i]})
}
return diffs
}
Insert cell
primesWithIndex = primes.map((p, i) => ({ index: i, value: p}))
Insert cell
primes = getPrimes(1000000)
Insert cell
function getPrimes(x) {
let primes = [];
for (let prime of primeGenerator()) {
if (prime < x) {
primes.push(prime);
} else {
return primes;
}
}
}
Insert cell
function* nat() {
let i = 1;
while (true) {
yield i;
i++;
}
}
Insert cell
Insert cell
_.range(1, 200).map(fibo)
Insert cell
function fibo(n) {
const phi = (1 + Math.sqrt(5)) / 2;
const ihp = (1 - Math.sqrt(5)) / 2;
return Math.round((phi**n - ihp**n) / Math.sqrt(5))
}
Insert cell
facts = {
const k = [];
for (let f of factorial()) {
k.push(f);
if (f > 10 ** 53) {
break;
}
}
return k;
}
Insert cell
g2_2s = {
let list = [];
let n = 1n;
while (true) {
let order = g2_2(n);
list.push(order);
n += 1n;
if (order > 10 ** 53) {
break;
}
}
return list;
}
Insert cell
function g2_2(n) {
const q = 3n ** (2n * n - 1n);
return q ** 3n * (q ** 3n - 1n) * (q - 1n);
}
Insert cell
function* factorial() {
let n = 1;
let i = 2;
while (true) {
yield n;
n *= i;
i += 1;
}
}
Insert cell
function gcd(a, b) {
while (b !== 0) {
let t = b;
b = a % b;
a = t;
}
return a;
}
Insert cell
import { primes as primeGenerator } from "@mourner/fast-prime-generator"
Insert cell
import { vl } from "@vega/vega-lite-api-v5"
Insert cell
_ = require("lodash")
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more