euler/euler.js

123 lines
2.1 KiB
JavaScript
Raw Permalink Normal View History

2024-03-06 18:55:45 -06:00
export var isprime = function(num)
{
if (num == 2 || num == 3)
return true;
if (num <= 1 || num % 2 == 0 || num % 3 == 0)
return false;
for (let i = 5; i * i <= num ; i+=6) {
if (num % i == 0 || num % (i + 2) == 0)
return false;
}
return true;
}
export function isodd(n) { return n%2; }
export function iseven(n) { return !isodd(n); }
export var divisors = function(n)
{
var d = [];
var high = Math.sqrt(n);
for (var i = 2; i < high; i++)
if (n%i === 0)
d = d.concat([i, n/i]);
d.push(1);
return d;
}
export function rotate_num(n)
{
var dig = digits(n);
return Math.trunc((n%10)*Math.pow(10,dig-1)+(n/10));
}
function arr_swap(A,i,j)
{
var a = A[i];
var b = A[j];
A[i] = b;
A[j] = a;
}
export function permutate_num(n)
{
var perms = [];
function arr_gen(k, A)
{
if (k === 1) {
perms.push(A.slice());
return;
}
arr_gen(k-1, A);
for (var i = 0; i < k-1; i++) {
if (k%2 === 0)
arr_swap(A,i,k-1);
else
arr_swap(A,0,k-1);
arr_gen(k-1,A);
}
}
var d = digitize(n);
d = d.map(x=>String(x));
arr_gen(d.length, d);
perms = perms.map(function(p) {
var n = "";
for (var i = 0; i < p.length; i++)
n += p[i];
return Number(n);
});
return perms;
}
export function is_pandigital(n)
{
var s = n;
if (typeof s === 'number')
s = String(s);
var nums = s.split('').sort();
return nums.every((x,i) => x == i+1);
}
export var digitize = function(n)
{
var d = [];
while (n) {
d.push(n%10);
n = Math.trunc(n/10);
}
return d.reverse();
}
export var digits = function(n) { return Math.floor(Math.log10(Math.abs(n)))+1; }
export var factorial = function(n)
{
var s = 1;
for (var i = n; i > 0; i--)
s *= i;
return s;
}
export var combination = function(n,k) { return factorial(n)/(factorial(k)*factorial(n-k)); }
export var permutation = function(n,k) { return factorial(n)/factorial(n-k); }
export function euler39(n) {
if (n < 0 || n > 39) return undefined;
return (n*n) + n + 41;
}
export function euler79(n) {
if (n < 0 || n > 79) return undefined;
return (n*n)-79*n+1601;
}