Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

View file

@ -0,0 +1,3 @@
---
from: http://rosettacode.org/wiki/N-smooth_numbers
note: Prime Numbers

View file

@ -0,0 +1,53 @@
'''n-smooth''' &nbsp; numbers are positive integers which have no prime factors <big> &gt; </big> '''n'''.
The &nbsp; '''n''' &nbsp; in the expression &nbsp; '''n-smooth''' &nbsp; is always prime;
<br>there are &nbsp; <u>no</u> &nbsp; '''9-smooth''' numbers.
'''1''' &nbsp; (unity) &nbsp; is always included in n-smooth numbers.
<br>2-smooth &nbsp; numbers are non-negative powers of two.
<br>5-smooth &nbsp; numbers are also called &nbsp; [[Hamming numbers]].
<br>7-smooth &nbsp; numbers are also called &nbsp; [[humble numbers]].
A way to express &nbsp; 11-smooth &nbsp; numbers is:
<big><big> 11-smooth = 2<sup>i</sup> &times; 3<sup>j</sup> &times; 5<sup>k</sup> &times; 7<sup>m</sup> &times; 11<sup>p</sup></big></big>
where <big> i, j, k, m, p &ge; 0 </big>
;Task:
:* &nbsp; calculate and show the first &nbsp; '''25''' &nbsp; n-smooth numbers &nbsp; for &nbsp; '''n=2''' &nbsp; ───► &nbsp; '''n=29'''
:* &nbsp; calculate and show &nbsp; three numbers starting with &nbsp; '''3,000''' &nbsp; n-smooth numbers &nbsp; for &nbsp; '''n=3''' &nbsp; ───► &nbsp; '''n=29'''
:* &nbsp; calculate and show twenty numbers starting with &nbsp;'''30,000''' &nbsp; n-smooth numbers &nbsp; for &nbsp; '''n=503''' &nbsp; ───► &nbsp; '''n=521''' &nbsp; (optional)
All ranges &nbsp; (for &nbsp; '''n''') &nbsp; are to be inclusive, and only prime numbers are to be used.
<br>The (optional) n-smooth numbers for the third range are: &nbsp; '''503''', &nbsp; '''509''', &nbsp; and &nbsp; '''521'''.
<br>Show all n-smooth numbers for any particular &nbsp; '''n''' &nbsp; in a horizontal list.
<br>Show all output here on this page.
;Related tasks:
:* &nbsp; [[Hamming numbers]]
:* &nbsp; [[humble numbers]]
;References:
:* &nbsp; Wikipedia entry: &nbsp; [[wp:Hamming numbers|Hamming numbers]] &nbsp; &nbsp; (this link is re-directed to &nbsp; '''Regular number''').
:* &nbsp; Wikipedia entry: &nbsp; [[wp:Smooth number|Smooth number]]
:* &nbsp; OEIS entry: &nbsp; [[oeis:A000079|A000079 &nbsp; &nbsp;2-smooth numbers or non-negative powers of two]]
:* &nbsp; OEIS entry: &nbsp; [[oeis:A003586|A003586 &nbsp; &nbsp;3-smooth numbers]]
:* &nbsp; Mintz 1981: &nbsp; [https://www.fq.math.ca/Scanned/19-4/mintz.pdf 3-smooth numbers]
:* &nbsp; OEIS entry: &nbsp; [[oeis:A051037|A051037 &nbsp; &nbsp;5-smooth numbers or Hamming numbers]]
:* &nbsp; OEIS entry: &nbsp; [[oeis:A002473|A002473 &nbsp; &nbsp;7-smooth numbers or humble numbers]]
:* &nbsp; OEIS entry: &nbsp; [[oeis:A051038|A051038 &nbsp; 11-smooth numbers]]
:* &nbsp; OEIS entry: &nbsp; [[oeis:A080197|A080197 &nbsp; 13-smooth numbers]]
:* &nbsp; OEIS entry: &nbsp; [[oeis:A080681|A080681 &nbsp; 17-smooth numbers]]
:* &nbsp; OEIS entry: &nbsp; [[oeis:A080682|A080682 &nbsp; 19-smooth numbers]]
:* &nbsp; OEIS entry: &nbsp; [[oeis:A080683|A080683 &nbsp; 23-smooth numbers]]
<br><br>

View file

@ -0,0 +1,76 @@
V primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
F isPrime(n)
I n < 2
R 0B
L(i) :primes
I n == i
R 1B
I n % i == 0
R 0B
I i * i > n
R 1B
print(Oops, n is too large)
R 0B
F init()
V s = 24
L s < 600
I isPrime(s - 1) & s - 1 > :primes.last
:primes.append(s - 1)
I isPrime(s + 1) & s + 1 > :primes.last
:primes.append(s + 1)
s += 6
F nsmooth(n, size)
assert(n C 2..521)
assert(size >= 1)
V bn = n
V ok = 0B
L(prime) :primes
I bn == prime
ok = 1B
L.break
assert(ok, must be a prime number)
V ns = [BigInt(0)] * size
ns[0] = 1
[BigInt] next
L(prime) :primes
I prime > bn
L.break
next.append(prime)
V indicies = [0] * next.len
L(m) 1 .< size
ns[m] = min(next)
L(i) 0 .< indicies.len
I ns[m] == next[i]
indicies[i]++
next[i] = :primes[i] * ns[indicies[i]]
R ns
init()
L(p) primes
I p >= 30
L.break
print(The first p -smooth numbers are:)
print(nsmooth(p, 25))
print()
L(p) primes[1..]
I p >= 30
L.break
print(The 3000 to 3202 p -smooth numbers are:)
print(nsmooth(p, 3002)[2999..])
print()
L(p) [503, 509, 521]
print(The 30000 to 3019 p -smooth numbers are:)
print(nsmooth(p, 30019)[29999..])
print()

View file

@ -0,0 +1,133 @@
#include <algorithm>
#include <iostream>
#include <vector>
std::vector<uint64_t> primes;
std::vector<uint64_t> smallPrimes;
template <typename T>
std::ostream &operator <<(std::ostream &os, const std::vector<T> &v) {
auto it = v.cbegin();
auto end = v.cend();
os << '[';
if (it != end) {
os << *it;
it = std::next(it);
}
for (; it != end; it = std::next(it)) {
os << ", " << *it;
}
return os << ']';
}
bool isPrime(uint64_t value) {
if (value < 2) return false;
if (value % 2 == 0) return value == 2;
if (value % 3 == 0) return value == 3;
if (value % 5 == 0) return value == 5;
if (value % 7 == 0) return value == 7;
if (value % 11 == 0) return value == 11;
if (value % 13 == 0) return value == 13;
if (value % 17 == 0) return value == 17;
if (value % 19 == 0) return value == 19;
if (value % 23 == 0) return value == 23;
uint64_t t = 29;
while (t * t < value) {
if (value % t == 0) return false;
value += 2;
if (value % t == 0) return false;
value += 4;
}
return true;
}
void init() {
primes.push_back(2);
smallPrimes.push_back(2);
uint64_t i = 3;
while (i <= 521) {
if (isPrime(i)) {
primes.push_back(i);
if (i <= 29) {
smallPrimes.push_back(i);
}
}
i += 2;
}
}
std::vector<uint64_t> nSmooth(uint64_t n, size_t size) {
if (n < 2 || n>521) {
throw std::runtime_error("n must be between 2 and 521");
}
if (size <= 1) {
throw std::runtime_error("size must be at least 1");
}
uint64_t bn = n;
if (primes.cend() == std::find(primes.cbegin(), primes.cend(), bn)) {
throw std::runtime_error("n must be a prime number");
}
std::vector<uint64_t> ns(size, 0);
ns[0] = 1;
std::vector<uint64_t> next;
for (auto prime : primes) {
if (prime > bn) {
break;
}
next.push_back(prime);
}
std::vector<size_t> indicies(next.size(), 0);
for (size_t m = 1; m < size; m++) {
ns[m] = *std::min_element(next.cbegin(), next.cend());
for (size_t i = 0; i < indicies.size(); i++) {
if (ns[m] == next[i]) {
indicies[i]++;
next[i] = primes[i] * ns[indicies[i]];
}
}
}
return ns;
}
int main() {
init();
for (auto i : smallPrimes) {
std::cout << "The first " << i << "-smooth numbers are:\n";
std::cout << nSmooth(i, 25) << '\n';
std::cout << '\n';
}
// there is not enough bits to fully represent the 3-smooth numbers
for (size_t i = 0; i < smallPrimes.size(); i++) {
if (i < 1) continue;
auto p = smallPrimes[i];
auto v = nSmooth(p, 3002);
v.erase(v.begin(), v.begin() + 2999);
std::cout << "The 30,000th to 30,019th " << p << "-smooth numbers are:\n";
std::cout << v << '\n';
std::cout << '\n';
}
return 0;
}

View file

@ -0,0 +1,140 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
namespace NSmooth {
class Program {
static readonly List<BigInteger> primes = new List<BigInteger>();
static readonly List<int> smallPrimes = new List<int>();
static Program() {
primes.Add(2);
smallPrimes.Add(2);
BigInteger i = 3;
while (i <= 521) {
if (IsPrime(i)) {
primes.Add(i);
if (i <= 29) {
smallPrimes.Add((int)i);
}
}
i += 2;
}
}
static bool IsPrime(BigInteger value) {
if (value < 2) return false;
if (value % 2 == 0) return value == 2;
if (value % 3 == 0) return value == 3;
if (value % 5 == 0) return value == 5;
if (value % 7 == 0) return value == 7;
if (value % 11 == 0) return value == 11;
if (value % 13 == 0) return value == 13;
if (value % 17 == 0) return value == 17;
if (value % 19 == 0) return value == 19;
if (value % 23 == 0) return value == 23;
BigInteger t = 29;
while (t * t < value) {
if (value % t == 0) return false;
value += 2;
if (value % t == 0) return false;
value += 4;
}
return true;
}
static List<BigInteger> NSmooth(int n, int size) {
if (n < 2 || n > 521) {
throw new ArgumentOutOfRangeException("n");
}
if (size < 1) {
throw new ArgumentOutOfRangeException("size");
}
BigInteger bn = n;
bool ok = false;
foreach (var prime in primes) {
if (bn == prime) {
ok = true;
break;
}
}
if (!ok) {
throw new ArgumentException("must be a prime number", "n");
}
BigInteger[] ns = new BigInteger[size];
ns[0] = 1;
for (int i = 1; i < size; i++) {
ns[i] = 0;
}
List<BigInteger> next = new List<BigInteger>();
foreach (var prime in primes) {
if (prime > bn) {
break;
}
next.Add(prime);
}
int[] indices = new int[next.Count];
for (int i = 0; i < indices.Length; i++) {
indices[i] = 0;
}
for (int m = 1; m < size; m++) {
ns[m] = next.Min();
for (int i = 0; i < indices.Length; i++) {
if (ns[m] == next[i]) {
indices[i]++;
next[i] = primes[i] * ns[indices[i]];
}
}
}
return ns.ToList();
}
static void Println<T>(IEnumerable<T> nums) {
Console.Write('[');
var it = nums.GetEnumerator();
if (it.MoveNext()) {
Console.Write(it.Current);
}
while (it.MoveNext()) {
Console.Write(", ");
Console.Write(it.Current);
}
Console.WriteLine(']');
}
static void Main() {
foreach (var i in smallPrimes) {
Console.WriteLine("The first {0}-smooth numbers are:", i);
Println(NSmooth(i, 25));
Console.WriteLine();
}
foreach (var i in smallPrimes.Skip(1)) {
Console.WriteLine("The 3,000 to 3,202 {0}-smooth numbers are:", i);
Println(NSmooth(i, 3_002).Skip(2_999));
Console.WriteLine();
}
foreach (var i in new int[] { 503, 509, 521 }) {
Console.WriteLine("The 30,000 to 3,019 {0}-smooth numbers are:", i);
Println(NSmooth(i, 30_019).Skip(29_999));
Console.WriteLine();
}
}
}
}

View file

@ -0,0 +1,126 @@
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
void* xmalloc(size_t n) {
void* ptr = malloc(n);
if (ptr == NULL) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
return ptr;
}
void* xrealloc(void* p, size_t n) {
void* ptr = realloc(p, n);
if (ptr == NULL) {
fprintf(stderr, "Out of memory\n");
exit(1);
}
return ptr;
}
bool is_prime(uint32_t n) {
if (n == 2)
return true;
if (n < 2 || n % 2 == 0)
return false;
for (uint32_t p = 3; p * p <= n; p += 2) {
if (n % p == 0)
return false;
}
return true;
}
// Populates primes with the prime numbers between from and to and
// returns the number of primes found.
uint32_t find_primes(uint32_t from, uint32_t to, uint32_t** primes) {
uint32_t count = 0, buffer_length = 16;
uint32_t* buffer = xmalloc(sizeof(uint32_t) * buffer_length);
for (uint32_t p = from; p <= to; ++p) {
if (is_prime(p)) {
if (count >= buffer_length) {
uint32_t new_length = buffer_length * 2;
if (new_length < count + 1)
new_length = count + 1;
buffer = xrealloc(buffer, sizeof(uint32_t) * new_length);
buffer_length = new_length;
}
buffer[count++] = p;
}
}
*primes = buffer;
return count;
}
void free_numbers(mpz_t* numbers, size_t count) {
for (size_t i = 0; i < count; ++i)
mpz_clear(numbers[i]);
free(numbers);
}
// Returns an array containing first count n-smooth numbers
mpz_t* find_nsmooth_numbers(uint32_t n, uint32_t count) {
uint32_t* primes = NULL;
uint32_t num_primes = find_primes(2, n, &primes);
mpz_t* numbers = xmalloc(sizeof(mpz_t) * count);
mpz_t* queue = xmalloc(sizeof(mpz_t) * num_primes);
uint32_t* index = xmalloc(sizeof(uint32_t) * num_primes);
for (uint32_t i = 0; i < num_primes; ++i) {
index[i] = 0;
mpz_init_set_ui(queue[i], primes[i]);
}
for (uint32_t i = 0; i < count; ++i)
mpz_init(numbers[i]);
mpz_set_ui(numbers[0], 1);
for (uint32_t i = 1; i < count; ++i) {
for (uint32_t p = 0; p < num_primes; ++p) {
if (mpz_cmp(queue[p], numbers[i - 1]) == 0)
mpz_mul_ui(queue[p], numbers[++index[p]], primes[p]);
}
uint32_t min_index = 0;
for (uint32_t p = 1; p < num_primes; ++p) {
if (mpz_cmp(queue[min_index], queue[p]) > 0)
min_index = p;
}
mpz_set(numbers[i], queue[min_index]);
}
free_numbers(queue, num_primes);
free(primes);
free(index);
return numbers;
}
void print_nsmooth_numbers(uint32_t n, uint32_t begin, uint32_t count) {
uint32_t num = begin + count;
mpz_t* numbers = find_nsmooth_numbers(n, num);
printf("%u: ", n);
mpz_out_str(stdout, 10, numbers[begin]);
for (uint32_t i = 1; i < count; ++i) {
printf(", ");
mpz_out_str(stdout, 10, numbers[begin + i]);
}
printf("\n");
free_numbers(numbers, num);
}
int main() {
printf("First 25 n-smooth numbers for n = 2 -> 29:\n");
for (uint32_t n = 2; n <= 29; ++n) {
if (is_prime(n))
print_nsmooth_numbers(n, 0, 25);
}
printf("\n3 n-smooth numbers starting from 3000th for n = 3 -> 29:\n");
for (uint32_t n = 3; n <= 29; ++n) {
if (is_prime(n))
print_nsmooth_numbers(n, 2999, 3);
}
printf("\n20 n-smooth numbers starting from 30,000th for n = 503 -> 521:\n");
for (uint32_t n = 503; n <= 521; ++n) {
if (is_prime(n))
print_nsmooth_numbers(n, 29999, 20);
}
return 0;
}

View file

@ -0,0 +1,56 @@
require "big"
def prime?(n) # P3 Prime Generator primality test
return false unless (n | 1 == 3 if n < 5) || (n % 6) | 4 == 5
sqrt_n = Math.isqrt(n) # For Crystal < 1.2.0 use Math.sqrt(n).to_i
pc = typeof(n).new(5)
while pc <= sqrt_n
return false if n % pc == 0 || n % (pc + 2) == 0
pc += 6
end
true
end
def gen_primes(a, b)
(a..b).select { |pc| pc if prime? pc }
end
def nsmooth(n, limit)
raise "Exception(n or limit)" if n < 2 || n > 521 || limit < 1
raise "Exception(must be a prime number: n)" unless prime? n
primes = gen_primes(2, n)
ns = [0.to_big_i] * limit
ns[0] = 1.to_big_i
nextp = primes[0..primes.index(n)].map { |prm| prm.to_big_i }
indices = [0] * nextp.size
(1...limit).each do |m|
ns[m] = nextp.min
(0...indices.size).each do |i|
if ns[m] == nextp[i]
indices[i] += 1
nextp[i] = primes[i] * ns[indices[i]]
end
end
end
ns
end
gen_primes(2, 29).each do |prime|
print "The first 25 #{prime}-smooth numbers are: \n"
print nsmooth(prime, 25)
puts
end
puts
gen_primes(3, 29).each do |prime|
print "The 3000 to 3202 #{prime}-smooth numbers are: "
print nsmooth(prime, 3002)[2999..]
puts
end
puts
gen_primes(503, 521).each do |prime|
print "The 30,000 to 30,019 #{prime}-smooth numbers are: \n"
print nsmooth(prime, 30019)[29999..]
puts
end

View file

@ -0,0 +1,119 @@
import std.algorithm;
import std.bigint;
import std.exception;
import std.range;
import std.stdio;
BigInt[] primes;
int[] smallPrimes;
bool isPrime(BigInt value) {
if (value < 2) return false;
if (value % 2 == 0) return value == 2;
if (value % 3 == 0) return value == 3;
if (value % 5 == 0) return value == 5;
if (value % 7 == 0) return value == 7;
if (value % 11 == 0) return value == 11;
if (value % 13 == 0) return value == 13;
if (value % 17 == 0) return value == 17;
if (value % 19 == 0) return value == 19;
if (value % 23 == 0) return value == 23;
BigInt t = 29;
while (t * t < value) {
if (value % t == 0) return false;
value += 2;
if (value % t == 0) return false;
value += 4;
}
return true;
}
// cache all primes up to 521
void init() {
primes ~= BigInt(2);
smallPrimes ~= 2;
BigInt i = 3;
while (i <= 521) {
if (isPrime(i)) {
primes ~= i;
if (i <= 29) {
smallPrimes ~= i.toInt;
}
}
i += 2;
}
}
BigInt[] nSmooth(int n, int size)
in {
enforce(n >= 2 && n <= 521, "n must be between 2 and 521");
enforce(size > 1, "size must be at least 1");
}
do {
BigInt bn = n;
bool ok = false;
foreach (prime; primes) {
if (bn == prime) {
ok = true;
break;
}
}
enforce(ok, "n must be a prime number");
BigInt[] ns;
ns.length = size;
ns[] = BigInt(0);
ns[0] = 1;
BigInt[] next;
foreach(prime; primes) {
if (prime > bn) {
break;
}
next ~= prime;
}
int[] indicies;
indicies.length = next.length;
indicies[] = 0;
foreach (m; 1 .. size) {
ns[m] = next.reduce!min;
foreach (i,v; indicies) {
if (ns[m] == next[i]) {
indicies[i]++;
next[i] = primes[i] * ns[indicies[i]];
}
}
}
return ns;
}
void main() {
init();
foreach (i; smallPrimes) {
writeln("The first ", i, "-smooth numbers are:");
writeln(nSmooth(i, 25));
writeln;
}
foreach (i; smallPrimes.drop(1)) {
writeln("The 3,000th to 3,202 ", i, "-smooth numbers are:");
writeln(nSmooth(i, 3_002).drop(2_999));
writeln;
}
foreach (i; [503, 509, 521]) {
writeln("The 30,000th to 30,019 ", i, "-smooth numbers are:");
writeln(nSmooth(i, 30_019).drop(29_999));
writeln;
}
}

View file

@ -0,0 +1,196 @@
program N_smooth_numbers;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Generics.Collections,
Velthuis.BigIntegers;
var
primes: TList<BigInteger>;
smallPrimes: TList<Integer>;
function IsPrime(value: BigInteger): Boolean;
var
v: BigInteger;
begin
if value < 2 then
exit(False);
for v in [2, 3, 5, 7, 11, 13, 17, 19, 23] do
begin
if (value mod v) = 0 then
exit(value = v);
end;
v := 29;
while v * v < value do
begin
if (value mod v) = 0 then
exit(False);
inc(value, 2);
if (value mod v) = 0 then
exit(False);
inc(v, 4);
end;
Result := True;
end;
function Min(values: TList<BigInteger>): BigInteger;
var
value: BigInteger;
begin
if values.Count = 0 then
exit(0);
Result := values[0];
for value in values do
begin
if value < Result then
result := value;
end;
end;
function NSmooth(n, size: Integer): TList<BigInteger>;
var
bn, p: BigInteger;
ok: Boolean;
i: Integer;
next: TList<BigInteger>;
indices: TList<Integer>;
m: Integer;
begin
Result := TList<BigInteger>.Create;
if (n < 2) or (n > 521) then
raise Exception.Create('Argument out of range: "n"');
if (size < 1) then
raise Exception.Create('Argument out of range: "size"');
bn := n;
ok := false;
for p in primes do
begin
ok := bn = p;
if ok then
break;
end;
if not ok then
raise Exception.Create('"n" must be a prime number');
Result.Add(1);
for i := 1 to size - 1 do
Result.Add(0);
next := TList<BigInteger>.Create;
for p in primes do
begin
if p > bn then
Break;
next.Add(p);
end;
indices := TList<Integer>.Create;
for i := 0 to next.Count - 1 do
indices.Add(0);
for m := 1 to size - 1 do
begin
Result[m] := Min(next);
for i := 0 to indices.Count - 1 do
if Result[m] = next[i] then
begin
indices[i] := indices[i] + 1;
next[i] := primes[i] * Result[indices[i]];
end;
end;
indices.Free;
next.Free;
end;
procedure Init();
var
i: BigInteger;
begin
primes := TList<BigInteger>.Create;
smallPrimes := TList<Integer>.Create;
primes.Add(2);
smallPrimes.Add(2);
i := 3;
while i <= 521 do
begin
if IsPrime(i) then
begin
primes.Add(i);
if i <= 29 then
smallPrimes.Add(Integer(i));
end;
inc(i, 2);
end;
end;
procedure Println(values: TList<BigInteger>; CanFree: Boolean = False);
var
value: BigInteger;
begin
Write('[');
for value in values do
Write(value.ToString, ', ');
Writeln(']'#10);
if CanFree then
values.Free;
end;
procedure Finish();
begin
primes.Free;
smallPrimes.Free;
end;
var
p: Integer;
ns: TList<BigInteger>;
const
RANGE_3: array[0..2] of integer = (503, 509, 521);
begin
Init;
for p in smallPrimes do
begin
Writeln('The first ', p, '-smooth numbers are:');
Println(NSmooth(p, 25), True);
end;
smallPrimes.Delete(0);
for p in smallPrimes do
begin
Writeln('The 3,000 to 3,202 ', p, '-smooth numbers are:');
ns := nSmooth(p, 3002);
ns.DeleteRange(0, 2999);
println(ns, True);
end;
for p in RANGE_3 do
begin
Writeln('The 3,000 to 3,019 ', p, '-smooth numbers are:');
ns := nSmooth(p, 30019);
ns.DeleteRange(0, 29999);
println(ns, True);
end;
Finish;
Readln;
end.

View file

@ -0,0 +1,151 @@
module Main exposing ( main )
import Bitwise exposing (..)
import BigInt exposing ( BigInt )
import Task exposing ( Task, succeed, perform, andThen )
import Html exposing ( div, text, br )
import Browser exposing ( element )
import Time exposing ( now, posixToMillis )
-- an infinite non-empty non-memoizing Co-Inductive Stream (CIS)...
type CIS a = CIS a (() -> CIS a)
takeCIS2String : Int -> (a -> String) -> CIS a -> String
takeCIS2String n cnvf (CIS ohd otlf) =
let loop i (CIS hd tl) str =
if i < 1 then str
else loop (i - 1) (tl()) (str ++ ", " ++ cnvf hd)
in loop (n - 1) (otlf()) (cnvf ohd)
dropCIS : Int -> CIS a -> CIS a
dropCIS n (CIS _ tl as cis) =
if n < 1 then cis else dropCIS (n - 1) (tl())
-- Priority Queue definition...
type PriorityQ comparable v =
Mt
| Br comparable v (PriorityQ comparable v)
(PriorityQ comparable v)
emptyPQ : PriorityQ comparable v
emptyPQ = Mt
peekMinPQ : PriorityQ comparable v -> Maybe (comparable, v)
peekMinPQ pq = case pq of
(Br k v _ _) -> Just (k, v)
Mt -> Nothing
pushPQ : comparable -> v -> PriorityQ comparable v
-> PriorityQ comparable v
pushPQ wk wv pq =
case pq of
Mt -> Br wk wv Mt Mt
(Br vk vv pl pr) ->
if wk <= vk then Br wk wv (pushPQ vk vv pr) pl
else Br vk vv (pushPQ wk wv pr) pl
siftdown : comparable -> v -> PriorityQ comparable v
-> PriorityQ comparable v -> PriorityQ comparable v
siftdown wk wv pql pqr =
case pql of
Mt -> Br wk wv Mt Mt
(Br vkl vvl pll prl) ->
case pqr of
Mt -> if wk <= vkl then Br wk wv pql Mt
else Br vkl vvl (Br wk wv Mt Mt) Mt
(Br vkr vvr plr prr) ->
if wk <= vkl && wk <= vkr then Br wk wv pql pqr
else if vkl <= vkr then Br vkl vvl (siftdown wk wv pll prl) pqr
else Br vkr vvr pql (siftdown wk wv plr prr)
replaceMinPQ : comparable -> v -> PriorityQ comparable v
-> PriorityQ comparable v
replaceMinPQ wk wv pq = case pq of
Mt -> Mt
(Br _ _ pl pr) -> siftdown wk wv pl pr
primesTo : Int -> List Int
primesTo n =
if n < 3 then if n < 2 then [] else [2] else
let oddPrimesTo on =
let sqrtlmt = toFloat on |> sqrt |> truncate
obps = if sqrtlmt < 3 then [] else oddPrimesTo sqrtlmt
ns = List.range 0 ((on - 3) // 2) -- [ 3 .. 2 .. on ]
|> List.map ((+) 3 << (*) 2)
filtfnc fn = List.all (\ bp -> bp * bp > fn ||
modBy bp fn /= 0) obps
in List.filter filtfnc ns
in 2 :: oddPrimesTo n
smooths : Int -> CIS BigInt
smooths n =
let infcis v = CIS v <| \ _ -> infcis (BigInt.add v (BigInt.fromInt 1))
dflt = (0.0, BigInt.fromInt 1) in
if n < 2 then infcis (BigInt.fromInt 1) else
let prms = primesTo n |> List.reverse
|> List.map (\ p -> (logBase 2 (toFloat p), BigInt.fromInt p))
((lgfrstp, frstp) as frstpr) = List.head prms |> Maybe.withDefault dflt
rstps = List.tail prms |> Maybe.withDefault []
frstcis =
let nxt ((lg, v) as vpr) =
CIS vpr <| \ _ -> nxt (lg + lgfrstp, BigInt.mul v frstp)
in nxt frstpr
mkcis ((lg, p) as pr) cis =
let nxt pq (CIS ((lghd, hd) as hdpr) tlf as cs) =
let ((lgv, v) as vpr) = peekMinPQ pq |> Maybe.withDefault dflt in
if BigInt.lt v hd then CIS vpr <| \ _ ->
nxt (replaceMinPQ (lgv + lg) (BigInt.mul v p) pq) cs
else CIS hdpr <| \ _ ->
nxt (pushPQ (lghd + lg) (BigInt.mul hd p) pq) (tlf())
in CIS pr <| \ _ -> nxt (pushPQ (lg + lg) (BigInt.mul p p) emptyPQ) cis
rest() = List.foldl mkcis frstcis rstps
unpr (CIS (_, hd) tlf) = CIS hd <| \ _ -> unpr (tlf())
in CIS (BigInt.fromInt 1) <| \ _ -> unpr (rest())
timemillis : () -> Task Never Int -- a side effect function
timemillis() = now |> andThen (\ t -> succeed (posixToMillis t))
test : () -> Cmd Msg -- side effect function chain (includes "perform")...
test() =
timemillis()
|> andThen (\ strt ->
let test1 = primesTo 29 |> List.map ( \ p ->
[ "The first 25 " ++ String.fromInt p ++ "-smooths:"
, smooths p |> takeCIS2String 25 BigInt.toString
, "" ])
test2 = primesTo 29 |> List.drop 1 |> List.map ( \ p ->
[ "The first three from the 3,000th "
++ String.fromInt p ++ "-smooth numbers are:"
, smooths p |> dropCIS 2999
|> takeCIS2String 3 BigInt.toString
, "" ])
test3 = primesTo 521 |> List.filter ((<=) 503) |> List.map ( \ p ->
[ "The first 20 30,000th up "
++ String.fromInt p ++ "-smooth numbers are:"
, smooths p |> dropCIS 29999
|> takeCIS2String 20 BigInt.toString
, "" ])
in timemillis()
|> andThen (\ stop ->
succeed ([test1, test2, test3, [[ "This took "
++ String.fromInt (stop - strt)
++ " milliseconds."]]]
|> List.concat |> List.concat)))
|> perform Done
-- following code has to do with outputting to a web page using MUV/TEA...
type alias Model = List String
type Msg = Done Model
main : Program () Model Msg
main = -- starts with empty list of strings; views model of filled list...
element { init = \ _ -> ( [], test() )
, update = \ (Done mdl) _ -> ( mdl , Cmd.none )
, subscriptions = \ _ -> Sub.none
, view = \ mdl ->
div [] <| List.map (\ s ->
if s == "" then br [] []
else div [] <| List.singleton <| text s) mdl
}

View file

@ -0,0 +1,52 @@
let primesTo n =
if n < 3 then (if n < 2 then Seq.empty else Seq.singleton 2) else
let rec oddPrimesTo on =
let sqrtlmt = double on |> sqrt |> truncate |> int
let obps = if sqrtlmt < 3 then Seq.empty else oddPrimesTo sqrtlmt
let ns = [ 3 .. 2 .. on ]
let filtfnc fn = Seq.forall (fun bp -> bp * bp > fn ||
fn % bp <> 0) obps
Seq.filter filtfnc ns
Seq.append (Seq.singleton 2) (oddPrimesTo n)
type LazyList<'a> = Cons of 'a * Lazy<LazyList<'a>>
// Doesn't need to be that efficient for the task...
#nowarn "40" // don't need to warn for recursive values
let smooths p =
if p < 2 then Seq.singleton (bigint 1) else
let smthprms = primesTo p |> Seq.rev |> Seq.map bigint
let frstp = Seq.head smthprms
let rstps = Seq.tail smthprms
let frstll =
let rec nxt n =
Cons(n, lazy nxt (n * frstp))
nxt frstp
let smult m lzylst =
let rec smlt (Cons(x, rxs)) =
Cons(m * x, lazy(smlt (rxs.Force())))
smlt lzylst
let rec merge (Cons(x, f) as xs) (Cons(y, g) as ys) =
if x < y then Cons(x, lazy(merge (f.Force()) ys))
else Cons(y, lazy(merge xs (g.Force())))
let u s n =
let rec r = merge s (smult n (Cons(1I, lazy r))) in r
Seq.unfold (fun (Cons(hd, rst)) -> Some (hd, rst.Value))
(Cons(1I, lazy(Seq.fold u frstll rstps)))
let strt = System.DateTime.Now.Ticks
primesTo 29 |> Seq.iter (fun p ->
printfn "First 25 %d-smooth:" p
smooths p |> Seq.take 25 |> Seq.toList |> printfn "%A\r\n")
primesTo 29 |> Seq.skip 1 |> Seq.iter (fun p ->
printfn "The first three from the 3,000th %d-smooth numbers are:" p
smooths p |> Seq.skip 2999 |> Seq.take 3 |> Seq.toList |> printfn "%A\r\n")
primesTo 521 |> Seq.skipWhile ((>) 503) |> Seq.iter (fun p ->
printfn "The first 20 30,000th up %d-smooth numbers are:" p
smooths p |> Seq.skip 29999 |> Seq.take 20 |> Seq.toList |> printfn "%A\r\n")
let stop = System.DateTime.Now.Ticks
printfn "This took %d milliseconds." ((stop - strt) / 10000L)

View file

@ -0,0 +1,86 @@
let primesTo n =
if n < 3 then (if n < 2 then Seq.empty else Seq.singleton 2) else
let rec oddPrimesTo on =
let sqrtlmt = double on |> sqrt |> truncate |> int
let obps = if sqrtlmt < 3 then Seq.empty else oddPrimesTo sqrtlmt
let ns = [ 3 .. 2 .. on ]
let filtfnc fn = Seq.forall (fun bp -> bp * bp > fn ||
fn % bp <> 0) obps
Seq.filter filtfnc ns
Seq.append (Seq.singleton 2) (oddPrimesTo n)
type CIS<'a> = CIS of 'a * (Unit -> CIS<'a>)
let rec skipCIS n (CIS(_, tlf) as cis) =
if n <= 0 then cis else skipCIS (n - 1) (tlf())
let stringCIS n (CIS(fhd, ftlf)) =
let rec addstr i (CIS(hd, tlf)) str =
if i <= 0 then str + " )"
else addstr (i - 1) (tlf()) (str + ", " + string hd)
addstr (n - 1) (ftlf()) ("( " + string fhd)
type Deque<'a> = Deque of int * int * int * 'a array
let makeDQ v =
let arr = Array.zeroCreate 1024 in arr.[0] <- v
Deque(1023, 0, 1, arr)
let growDQ (Deque(msk, hdi, tli, arr)) =
let sz = arr.Length
let nsz = if sz = 0 then 1024 else sz + sz
let narr = Array.zeroCreate nsz
let nhdi, ntli =
if hdi = 0 then Array.blit arr 0 narr 0 sz
hdi, sz
else let mv = hdi + sz // move top queue up...
Array.blit arr 0 narr 0 tli
Array.blit arr hdi narr mv (sz - hdi)
mv, tli
Deque(nsz - 1, nhdi, ntli, narr)
let pushDQ v (Deque(_, hdi, tli, _) as dq) =
let (Deque(nmsk, nhdi, ntli, narr)) = if tli <> hdi then dq
else growDQ dq
narr.[ntli] <- v
Deque(nmsk, nhdi, (ntli + 1) &&& nmsk, narr)
// Deque is never empty after the first push and always push before pull!
let inline peekDQ (Deque(_, hdi, _, arr)) = arr.[hdi]
let pullDQ (Deque(msk, hdi, tli, arr)) =
Deque(msk, (hdi + 1) &&& msk, tli, arr)
let smoothsNR p =
// if p < 2 then Seq.singleton (bigint 1) else
let smthprms = primesTo p |> Seq.rev |> Seq.map bigint
let frstp = Seq.head smthprms
let rstps = Seq.tail smthprms
let frstcis =
let rec nxt n =
CIS(n, fun () -> nxt (n * frstp)) in nxt frstp
let nxt dq =
Seq.initInfinite ((+) 1I << bigint)
let newcis cis p =
let rec nxt (CIS(hd, tlf) as cs) dq =
let nxtq = peekDQ dq
if hd < nxtq then CIS(hd, fun () -> nxt (tlf()) (pushDQ (hd * p) dq))
else CIS(nxtq, fun () -> nxt cs (pushDQ (nxtq * p) dq |> pullDQ))
CIS(p, fun () -> nxt cis (makeDQ (p * p)))
CIS(1I, fun () -> Seq.fold newcis frstcis rstps)
let strt = System.DateTime.Now.Ticks
primesTo 29 |> Seq.iter (fun p ->
printfn "First 25 %d-smooth:" p
smoothsNR p |> stringCIS 25 |> printfn "%s\r\n")
primesTo 29 |> Seq.skip 1 |> Seq.iter (fun p ->
printfn "The first three from the 3,000th %d-smooth numbers are:" p
smoothsNR p |> skipCIS 2999 |> stringCIS 3 |> printfn "%s\r\n")
primesTo 521 |> Seq.skipWhile ((>) 503) |> Seq.iter (fun p ->
printfn "The first 20 from the 30,000th up %d-smooth numbers are:" p
smoothsNR p |> skipCIS 29999 |> stringCIS 20 |> printfn "%s\r\n")
let stop = System.DateTime.Now.Ticks
printfn "This took %d milliseconds." ((stop - strt) / 10000L)

View file

@ -0,0 +1,39 @@
USING: deques dlists formatting fry io kernel locals make math
math.order math.primes math.text.english namespaces prettyprint
sequences tools.memory.private ;
IN: rosetta-code.n-smooth-numbers
SYMBOL: primes
: ns ( n -- seq )
primes-upto [ primes set ] [ length [ 1 1dlist ] replicate ]
bi ;
: enqueue ( n seq -- )
[ primes get ] 2dip [ '[ _ * ] map ] dip [ push-back ] 2each
;
: next ( seq -- n )
dup [ peek-front ] map infimum
[ '[ dup peek-front _ = [ pop-front* ] [ drop ] if ] each ]
[ swap enqueue ] [ nip ] 2tri ;
: next-n ( seq n -- seq )
swap '[ _ [ _ next , ] times ] { } make ;
:: n-smooth ( n from to -- seq )
n ns to next-n to from - 1 + tail* ;
:: show-smooth ( plo phi lo hi -- )
plo phi primes-between [
:> p lo commas lo ordinal-suffix hi commas hi
ordinal-suffix p "%s%s through %s%s %d-smooth numbers: "
printf p lo hi n-smooth [ pprint bl ] each nl
] each ;
: smooth-numbers-demo ( -- )
2 29 1 25 show-smooth nl
3 29 3000 3002 show-smooth nl
503 521 30,000 30,019 show-smooth ;
MAIN: smooth-numbers-demo

View file

@ -0,0 +1,147 @@
program HammNumb;
{$IFDEF FPC} {$MODE DELPHI} {$OPTIMIZATION ON,ALL}{$ENDIF}
{$IFDEF WINDOWS}{$APPTYPE CONSOLE}{$ENDIF}
type
tHamNum = record
hampot : array[0..167] of Word;
hampotmax,
hamNum : NativeUint;
end;
const
primes : array[0..167] of word =
(2, 3, 5, 7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71
,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151
,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233
,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317
,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419
,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503
,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607
,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701
,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811
,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911
,919,929,937,941,947,953,967,971,977,983,991,997);
var
HNum:tHamNum;
procedure OutHamNum(const HNum:tHamNum);
var
i : NativeInt;
Begin
with Hnum do
Begin
write(hamNum:12,' : ');
For i := 0 to hampotmax-1 do
Begin
if hampot[i] >0 then
if hampot[i] = 1 then
write(primes[i],'*')
else
write(primes[i],'^',hampot[i],'*');
end;
if hampot[hampotmax] >0 then
begin
write(primes[hampotmax]);
if hampot[hampotmax] > 1 then
write('^',hampot[hampotmax]);
end;
end;
writeln;
end;
procedure NextHammNum(var HNum:tHamNum;maxP:NativeInt);
var
q,p,nr,n,pIdx,momPrime : NativeUInt;
begin
//special case prime = 2
IF maxP = 0 then
begin
IF HNum.hampot[0] <> 0 then
HNum.hamNum *= 2
else
HNum.hamNum := 1;
inc(HNum.hampot[0]);
EXIT;
end;
n := HNum.hamNum;
repeat
inc(n);
nr := n;
pIdx := 0;
repeat
momPrime := primes[pIdx];
q := nr div momPrime;
p := 0;
While q*momPrime=nr do
Begin
inc(p);
nr := q;
q := nr div momPrime;
end;
HNum.hampot[pIdx] := p;
inc(pIdx);
until (nr=1) OR (pIdx > maxp)
//found one, than finished
until nr = 1;
With HNum do
Begin
hamNum := n;
hamPotmax := pIdx-1;
end;
end;
procedure OutXafterYSmooth(X,Y,SmoothIdx: NativeUInt);
var
i: NativeUint;
begin
IF SmoothIdx> High(primes) then
EXIT;
fillChar(HNum,SizeOf(HNum),#0);
i := 0;
While HNum.HamNum < Y do
NextHammNum(HNum,SmoothIdx);
write('first ',X,' after ',Y,' ',primes[SmoothIdx]:3,'-smooth numbers : ');
IF x >10 then
writeln;
for i := 1 to X-1 do
begin
write(HNum.HamNum,' ');
NextHammNum(HNum,SmoothIdx);
end;
writeln(HNum.HamNum,' ');
end;
var
j: NativeUint;
Begin
j := 0;
while primes[j] <= 29 do
Begin
OutXafterYSmooth(25,1,j);
inc(j);
end;
writeln;
j := 1;
while primes[j] <= 29 do
Begin
OutXafterYSmooth(3,3000,j);
inc(j);
end;
writeln;
while primes[j] < 503 do
inc(j);
while primes[j] <= 521 do
Begin
OutXafterYSmooth(20,30000,j);
OutHamNum(Hnum);
inc(j);
end;
writeln;
End.

View file

@ -0,0 +1,99 @@
package main
import (
"fmt"
"log"
"math/big"
)
var (
primes []*big.Int
smallPrimes []int
)
// cache all primes up to 521
func init() {
two := big.NewInt(2)
three := big.NewInt(3)
p521 := big.NewInt(521)
p29 := big.NewInt(29)
primes = append(primes, two)
smallPrimes = append(smallPrimes, 2)
for i := three; i.Cmp(p521) <= 0; i.Add(i, two) {
if i.ProbablyPrime(0) {
primes = append(primes, new(big.Int).Set(i))
if i.Cmp(p29) <= 0 {
smallPrimes = append(smallPrimes, int(i.Int64()))
}
}
}
}
func min(bs []*big.Int) *big.Int {
if len(bs) == 0 {
log.Fatal("slice must have at least one element")
}
res := bs[0]
for _, i := range bs[1:] {
if i.Cmp(res) < 0 {
res = i
}
}
return res
}
func nSmooth(n, size int) []*big.Int {
if n < 2 || n > 521 {
log.Fatal("n must be between 2 and 521")
}
if size < 1 {
log.Fatal("size must be at least 1")
}
bn := big.NewInt(int64(n))
ok := false
for _, prime := range primes {
if bn.Cmp(prime) == 0 {
ok = true
break
}
}
if !ok {
log.Fatal("n must be a prime number")
}
ns := make([]*big.Int, size)
ns[0] = big.NewInt(1)
var next []*big.Int
for i := 0; i < len(primes); i++ {
if primes[i].Cmp(bn) > 0 {
break
}
next = append(next, new(big.Int).Set(primes[i]))
}
indices := make([]int, len(next))
for m := 1; m < size; m++ {
ns[m] = new(big.Int).Set(min(next))
for i := 0; i < len(indices); i++ {
if ns[m].Cmp(next[i]) == 0 {
indices[i]++
next[i].Mul(primes[i], ns[indices[i]])
}
}
}
return ns
}
func main() {
for _, i := range smallPrimes {
fmt.Printf("The first 25 %d-smooth numbers are:\n", i)
fmt.Println(nSmooth(i, 25), "\n")
}
for _, i := range smallPrimes[1:] {
fmt.Printf("The 3,000th to 3,202nd %d-smooth numbers are:\n", i)
fmt.Println(nSmooth(i, 3002)[2999:], "\n")
}
for _, i := range []int{503, 509, 521} {
fmt.Printf("The 30,000th to 30,019th %d-smooth numbers are:\n", i)
fmt.Println(nSmooth(i, 30019)[29999:], "\n")
}
}

View file

@ -0,0 +1,30 @@
import Data.Numbers.Primes (primes)
import Text.Printf (printf)
merge :: Ord a => [a] -> [a] -> [a]
merge [] b = b
merge a@(x:xs) b@(y:ys) | x < y = x : merge xs b
| otherwise = y : merge a ys
nSmooth :: Integer -> [Integer]
nSmooth p = 1 : foldr u [] factors
where
factors = takeWhile (<=p) primes
u n s = r
where r = merge s (map (n*) (1:r))
main :: IO ()
main = do
mapM_ (printf "First 25 %d-smooth:\n%s\n\n" <*> showTwentyFive) firstTenPrimes
mapM_
(printf "The 3,000 to 3,202 %d-smooth numbers are:\n%s\n\n" <*> showRange1)
firstTenPrimes
mapM_
(printf "The 30,000 to 30,019 %d-smooth numbers are:\n%s\n\n" <*> showRange2)
[503, 509, 521]
where
firstTenPrimes = take 10 primes
showTwentyFive = show . take 25 . nSmooth
showRange1 = show . ((<$> [2999 .. 3001]) . (!!) . nSmooth)
showRange2 = show . ((<$> [29999 .. 30018]) . (!!) . nSmooth)

View file

@ -0,0 +1,10 @@
nsmooth=: dyad define NB. TALLY nsmooth N
factors=. x: i.@:>:&.:(p:inv) y
smoothies=. , 1x
result=. , i. 0x
while. x > # result do.
mn =. {. smoothies
smoothies =. ({.~ (x <. #)) ~. /:~ (}. smoothies) , mn * factors
result=. result , mn
end.
)

View file

@ -0,0 +1,104 @@
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
public class NSmoothNumbers {
public static void main(String[] args) {
System.out.printf("show the first 25 n-smooth numbers for n = 2 through n = 29%n");
int max = 25;
List<BigInteger> primes = new ArrayList<>();
for ( int n = 2 ; n <= 29 ; n++ ) {
if ( isPrime(n) ) {
primes.add(BigInteger.valueOf(n));
System.out.printf("The first %d %d-smooth numbers:%n", max, n);
BigInteger[] humble = nSmooth(max, primes.toArray(new BigInteger[0]));
for ( int i = 0 ; i < max ; i++ ) {
System.out.printf("%s ", humble[i]);
}
System.out.printf("%n%n");
}
}
System.out.printf("show three numbers starting with 3,000 for n-smooth numbers for n = 3 through n = 29%n");
int count = 3;
max = 3000 + count - 1;
primes = new ArrayList<>();
primes.add(BigInteger.valueOf(2));
for ( int n = 3 ; n <= 29 ; n++ ) {
if ( isPrime(n) ) {
primes.add(BigInteger.valueOf(n));
System.out.printf("The %d through %d %d-smooth numbers:%n", max-count+1, max, n);
BigInteger[] nSmooth = nSmooth(max, primes.toArray(new BigInteger[0]));
for ( int i = max-count ; i < max ; i++ ) {
System.out.printf("%s ", nSmooth[i]);
}
System.out.printf("%n%n");
}
}
System.out.printf("Show twenty numbers starting with 30,000 n-smooth numbers for n=503 through n=521%n");
count = 20;
max = 30000 + count - 1;
primes = new ArrayList<>();
for ( int n = 2 ; n <= 521 ; n++ ) {
if ( isPrime(n) ) {
primes.add(BigInteger.valueOf(n));
if ( n >= 503 && n <= 521 ) {
System.out.printf("The %d through %d %d-smooth numbers:%n", max-count+1, max, n);
BigInteger[] nSmooth = nSmooth(max, primes.toArray(new BigInteger[0]));
for ( int i = max-count ; i < max ; i++ ) {
System.out.printf("%s ", nSmooth[i]);
}
System.out.printf("%n%n");
}
}
}
}
private static final boolean isPrime(long test) {
if ( test == 2 ) {
return true;
}
if ( test % 2 == 0 ) return false;
for ( long i = 3 ; i <= Math.sqrt(test) ; i += 2 ) {
if ( test % i == 0 ) {
return false;
}
}
return true;
}
private static BigInteger[] nSmooth(int n, BigInteger[] primes) {
int size = primes.length;
BigInteger[] test = new BigInteger[size];
for ( int i = 0 ; i < size ; i++ ) {
test[i] = primes[i];
}
BigInteger[] results = new BigInteger[n];
results[0] = BigInteger.ONE;
int[] indexes = new int[size];
for ( int i = 0 ; i < size ; i++ ) {
indexes[i] = 0;
}
for ( int index = 1 ; index < n ; index++ ) {
BigInteger min = test[0];
for ( int i = 1 ; i < size ; i++ ) {
min = min.min(test[i]);
}
results[index] = min;
for ( int i = 0 ; i < size ; i++ ) {
if ( results[index].compareTo(test[i]) == 0 ) {
indexes[i] = indexes[i] + 1;
test[i] = primes[i].multiply(results[indexes[i]]);
}
}
}
return results;
}
}

View file

@ -0,0 +1,48 @@
function isPrime(n){
var x = Math.floor(Math.sqrt(n)), i = 2
while ((i <= x) && (n % i != 0)) i++
return (x < i)
}
function smooth(n, s, k){
var p = []
for (let i = 2; i <= n; i++){
if (isPrime(i)){
p.push([BigInt(i), [1n], 0])
}
}
var res = []
for (let i = 0; i < s + k; i++){
var m = p[0][1][p[0][2]]
for (let j = 1; j < p.length; j++){
if (p[j][1][p[j][2]] < m) m = p[j][1][p[j][2]]
}
for (let j = 0; j < p.length; j++){
p[j][1].push(p[j][0]*m)
if (p[j][1][p[j][2]] == m) p[j][2]++
}
res.push(m)
}
return res.slice(s-1, s-1+k);
}
// main
var sOut = ""
for (let x of [[2, 29, 1, 25], [3, 29, 3000, 3], [503, 521, 30000, 20]]){
for (let n = x[0]; n <= x[1]; n++){
if (isPrime(n)){
sOut += x[2] + " to " + (x[2] - 1 + x[3]) + " " + n + "-smooth numbers: " + smooth(n, x[2], x[3]) + "\n"
}
}
}
console.log(sOut)

View file

@ -0,0 +1,60 @@
def select_while(s; cond):
label $out | s | if cond then . else break $out end;
### Some primes
# 168 small primes
def small_primes: [
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,
101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293,
307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397,
401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499,
503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599,
601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691,
701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797,
809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887,
907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997
];
### n-smooth numbers
def nSmooth($n; $size):
small_primes[-1] as $maxn
| if $n < 2 or $n > $maxn then "nSmooth: n must be in 2 .. \($maxn) inclusive" | error
elif ($size < 1) then "nSmooth: size must be at least 1" | error
elif any(small_primes[]; $n == .) | not then "nSmooth: n must be a prime number" | error
else (small_primes|length) as $length
| {ns: [1, (range(1; $size)|null)],
i: 0,
next: [] }
| until(.done or .i == $length;
if (small_primes[.i] > $n) then .done = true
else .next += [small_primes[.i]]
| .i += 1
end )
| .indices = [range(0; .next|length) | 0]
| reduce range(1; $size) as $m (.;
.ns[$m] = (.next | min)
| reduce range(0; .indices|length) as $i (.;
if (.ns[$m] == .next[$i])
then .indices[$i] += 1
| .next[$i] = small_primes[$i] * .ns[.indices[$i]]
else .
end ))
| .ns
end;
def task:
[select_while(small_primes[]; . <= 29)] as $smallPrimes
| ($smallPrimes[]
| "\nThe first 25 \(.)-smooth numbers are:",
nSmooth(.; 25)),
"",
($smallPrimes[1:][]
| "\nThe 3,000th to 3,202nd \(.)-smooth numbers are:",
nSmooth(.; 3002)[2999:] ),
"",
( (503, 509, 521)
|"\nThe 30,000th to 30,019th \(.)-smooth numbers are:",
nSmooth(.; 30019)[29999:] ) ;
task

View file

@ -0,0 +1,30 @@
using Primes
function nsmooth(N, needed)
nexts, smooths = [BigInt(i) for i in 2:N if isprime(i)], [BigInt(1)]
prim, count = deepcopy(nexts), 1
indices = ones(Int, length(nexts))
while count < needed
x = minimum(nexts)
push!(smooths, x)
count += 1
for j in 1:length(nexts)
(nexts[j] <= x) && (nexts[j] = prim[j] * smooths[(indices[j] += 1)])
end
end
return (smooths[end] > typemax(Int)) ? smooths : Int.(smooths)
end
function testnsmoothfilters()
for i in filter(isprime, 1:29)
println("The first 25 n-smooth numbers for n = $i are: ", nsmooth(i, 25))
end
for i in filter(isprime, 3:29)
println("The 3000th through 3002nd ($i)-smooth numbers are: ", nsmooth(i, 3002)[3000:3002])
end
for i in filter(isprime, 503:521)
println("The 30000th through 30019th ($i)-smooth numbers >= 30000 are: ", nsmooth(i, 30019)[30000:30019])
end
end
testnsmoothfilters()

View file

@ -0,0 +1,93 @@
import java.math.BigInteger
var primes = mutableListOf<BigInteger>()
var smallPrimes = mutableListOf<Int>()
// cache all primes up to 521
fun init() {
val two = BigInteger.valueOf(2)
val three = BigInteger.valueOf(3)
val p521 = BigInteger.valueOf(521)
val p29 = BigInteger.valueOf(29)
primes.add(two)
smallPrimes.add(2)
var i = three
while (i <= p521) {
if (i.isProbablePrime(1)) {
primes.add(i)
if (i <= p29) {
smallPrimes.add(i.toInt())
}
}
i += two
}
}
fun min(bs: List<BigInteger>): BigInteger {
require(bs.isNotEmpty()) { "slice must have at lease one element" }
val it = bs.iterator()
var res = it.next()
while (it.hasNext()) {
val t = it.next()
if (t < res) {
res = t
}
}
return res
}
fun nSmooth(n: Int, size: Int): List<BigInteger> {
require(n in 2..521) { "n must be between 2 and 521" }
require(size >= 1) { "size must be at least 1" }
val bn = BigInteger.valueOf(n.toLong())
var ok = false
for (prime in primes) {
if (bn == prime) {
ok = true
break
}
}
require(ok) { "n must be a prime number" }
val ns = Array<BigInteger>(size) { BigInteger.ZERO }
ns[0] = BigInteger.ONE
val next = mutableListOf<BigInteger>()
for (i in 0 until primes.size) {
if (primes[i] > bn) {
break
}
next.add(primes[i])
}
val indices = Array(next.size) { 0 }
for (m in 1 until size) {
ns[m] = min(next)
for (i in indices.indices) {
if (ns[m] == next[i]) {
indices[i]++
next[i] = primes[i] * ns[indices[i]]
}
}
}
return ns.toList()
}
fun main() {
init()
for (i in smallPrimes) {
println("The first 25 $i-smooth numbers are:")
println(nSmooth(i, 25))
println()
}
for (i in smallPrimes.drop(1)) {
println("The 3,000th to 3,202 $i-smooth numbers are:")
println(nSmooth(i, 3_002).drop(2_999))
println()
}
for (i in listOf(503, 509, 521)) {
println("The 30,000th to 30,019 $i-smooth numbers are:")
println(nSmooth(i, 30_019).drop(29_999))
println()
}
}

View file

@ -0,0 +1,47 @@
ClearAll[GenerateSmoothNumbers]
GenerateSmoothNumbers[max_?Positive] := GenerateSmoothNumbers[max, 7]
GenerateSmoothNumbers[max_?Positive, maxprime_?Positive] :=
Module[{primes, len, vars, body, endspecs, its, data},
primes = Prime[Range[PrimePi[maxprime]]];
len = Length[primes];
If[max < Min[primes],
{}
,
vars = Table[Unique[], len];
body = Times @@ (primes^vars);
endspecs = Prepend[Most[primes^vars], 1];
endspecs = FoldList[Times, endspecs];
its = Transpose[{vars, ConstantArray[0, len], MapThread[N@Log[#1, max/#2] &, {primes, endspecs}]}];
With[{b = body, is = its},
data = Table[b, Evaluate[Sequence @@ is]];
];
data = Sort[Flatten[data]];
data
]
]
Take[GenerateSmoothNumbers[10^8, 2], 25]
Take[GenerateSmoothNumbers[200, 3], 25]
Take[GenerateSmoothNumbers[200, 5], 25]
Take[GenerateSmoothNumbers[200, 7], 25]
Take[GenerateSmoothNumbers[200, 11], 25]
Take[GenerateSmoothNumbers[200, 13], 25]
Take[GenerateSmoothNumbers[200, 17], 25]
Take[GenerateSmoothNumbers[200, 19], 25]
Take[GenerateSmoothNumbers[200, 23], 25]
Take[GenerateSmoothNumbers[200, 29], 25]
Take[GenerateSmoothNumbers[10^40, 3], {3000, 3002}]
Take[GenerateSmoothNumbers[10^15, 5], {3000, 3002}]
Take[GenerateSmoothNumbers[10^10, 7], {3000, 3002}]
Take[GenerateSmoothNumbers[10^7, 11], {3000, 3002}]
Take[GenerateSmoothNumbers[10^7, 13], {3000, 3002}]
Take[GenerateSmoothNumbers[10^6, 17], {3000, 3002}]
Take[GenerateSmoothNumbers[10^5, 19], {3000, 3002}]
Take[GenerateSmoothNumbers[10^5, 23], {3000, 3002}]
Take[GenerateSmoothNumbers[10^5, 29], {3000, 3002}]
s = Select[Range[10^5], FactorInteger /* Last /* First /* LessEqualThan[503]];
s[[30000 ;; 30019]]
s = Select[Range[10^5], FactorInteger /* Last /* First /* LessEqualThan[509]];
s[[30000 ;; 30019]]
s = Select[Range[10^5], FactorInteger /* Last /* First /* LessEqualThan[521]];
s[[30000 ;; 30019]]

View file

@ -0,0 +1,62 @@
import sequtils, strutils
import bignum
const N = 521
func initPrimes(): tuple[primes: seq[Int]; smallPrimes: seq[int]] =
var sieve: array[2..N, bool]
for n in 2..N:
if not sieve[n]:
for k in countup(n * n, N, n): sieve[k] = true
for n, isComposite in sieve:
if not isComposite:
result.primes.add newInt(n)
if n <= 29: result.smallPrimes.add n
# Cache all primes up to N.
let (Primes, SmallPrimes) = initPrimes()
proc nSmooth(n, size: Positive): seq[Int] =
assert n in 2..N, "'n' must be between 2 and " & $N
let bn = newInt(n)
assert bn in Primes, "'n' must be a prime number"
result.setLen(size)
result[0] = newInt(1)
var next: seq[Int]
for prime in Primes:
if prime > bn: break
next.add prime
var indices = newSeq[int](next.len)
for m in 1..<size:
result[m] = next[next.minIndex()]
for i in 0..indices.high:
if result[m] == next[i]:
inc indices[i]
next[i] = Primes[i] * result[indices[i]]
when isMainModule:
for n in SmallPrimes:
echo "The first ", n, "-smooth numbers are:"
echo nSmooth(n, 25).join(" ")
echo ""
for n in SmallPrimes[1..^1]:
echo "The 3000th to 3202th ", n, "-smooth numbers are:"
echo nSmooth(n, 3002)[2999..^1].join(" ")
echo ""
for n in [503, 509, 521]:
echo "The 30000th to 30019th ", n, "-smooth numbers are:"
echo nSmooth(n, 30_019)[29_999..^1].join(" ")
echo ""

View file

@ -0,0 +1,15 @@
Vi__smooth(V0, C)= {
my( W= #V0, V_r= Vec([1],C), v= V0, ix= vector(W,i,1), t);
for( c= 2, C
, V_r[c]= t= vecmin(v);
for( w= 1, W
, if( v[w] == t, v[w]= V0[w] * V_r[ ix[w]++ ]);
);
);
V_r;
}
N_smooth(N, C=20, S=1)= Vi__smooth(primes([0,N]),S+C-1)[S..S+C-1];
[print(v) |v<-[N_smooth(N, 25) |N<-primes([ 2, 29])]];
[print(v) |v<-[N_smooth(N, 3, 3000) |N<-primes([ 3, 29])]];
[print(v) |v<-[N_smooth(N, 20, 30000) |N<-primes([503,521])]];

View file

@ -0,0 +1,61 @@
use strict;
use warnings;
use feature 'say';
use ntheory qw<primes>;
use List::Util qw<min>;
#use bigint # works, but slow
use Math::GMPz; # this module gives roughly 16x speed-up
sub smooth_numbers {
# my(@m) = @_; # use with 'bigint'
my @m = map { Math::GMPz->new($_) } @_; # comment out to NOT use Math::GMPz
my @s;
push @s, [1] for 0..$#m;
return sub {
my $n = $s[0][0];
$n = min $n, $s[$_][0] for 1..$#m;
for (0..$#m) {
shift @{$s[$_]} if $s[$_][0] == $n;
push @{$s[$_]}, $n * $m[$_]
}
return $n
}
}
sub abbrev {
my($n) = @_;
return $n if length($n) <= 50;
substr($n,0,10) . "...(@{[length($n) - 2*10]} digits omitted)..." . substr($n, -10, 10)
}
my @primes = @{primes(10_000)};
my $start = 3000; my $cnt = 3;
for my $n_smooth (0..9) {
say "\nFirst 25, and ${start}th through @{[$start+2]}nd $primes[$n_smooth]-smooth numbers:";
my $s = smooth_numbers(@primes[0..$n_smooth]);
my @S25;
push @S25, $s->() for 1..25;
say join ' ', @S25;
my @Sm; my $c = 25;
do {
my $sn = $s->();
push @Sm, abbrev($sn) if ++$c >= $start;
} until @Sm == $cnt;
say join ' ', @Sm;
}
$start = 30000; $cnt = 20;
for my $n_smooth (95..97) { # (503, 509, 521) {
say "\n${start}th through @{[$start+$cnt-1]}th $primes[$n_smooth]-smooth numbers:";
my $s = smooth_numbers(@primes[0..$n_smooth]);
my(@Sm,$c);
do {
my $sn = $s->();
push @Sm, $sn if ++$c >= $start;
} until @Sm == $cnt;
say join ' ', @Sm;
}

View file

@ -0,0 +1,38 @@
(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">include</span> <span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">nsmooth</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">needed</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">-- note that n is a prime index, ie 1,2,3,4... for 2,3,5,7...</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">smooth</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)},</span>
<span style="color: #000000;">nexts</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_primes</span><span style="color: #0000FF;">(-</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">indices</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span> <span style="color: #000000;">nexts</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(</span><span style="color: #000000;">nexts</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span> <span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">needed</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">mpz</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init_set</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">mpz_min</span><span style="color: #0000FF;">(</span><span style="color: #000000;">nexts</span><span style="color: #0000FF;">))</span>
<span style="color: #000000;">smooth</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">smooth</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">mpz_cmp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">nexts</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">],</span><span style="color: #000000;">x</span><span style="color: #0000FF;">)<=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">indices</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #7060A8;">mpz_mul_si</span><span style="color: #0000FF;">(</span><span style="color: #000000;">nexts</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">],</span><span style="color: #000000;">smooth</span><span style="color: #0000FF;">[</span><span style="color: #000000;">indices</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]],</span><span style="color: #7060A8;">get_prime</span><span style="color: #0000FF;">(</span><span style="color: #000000;">j</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">smooth</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">flat_str</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">shorten</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">mpz_get_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]),</span><span style="color: #000000;">ml</span><span style="color: #0000FF;">:=</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">10</span> <span style="color: #008080;">do</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d-smooth[1..25]: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">get_prime</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span><span style="color: #000000;">flat_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">nsmooth</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">25</span><span style="color: #0000FF;">))})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">10</span> <span style="color: #008080;">do</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d-smooth[3000..3002]: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">get_prime</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span><span style="color: #000000;">flat_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">nsmooth</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">3002</span><span style="color: #0000FF;">)[</span><span style="color: #000000;">3000</span><span style="color: #0000FF;">..</span><span style="color: #000000;">3002</span><span style="color: #0000FF;">])})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">96</span> <span style="color: #008080;">to</span> <span style="color: #000000;">98</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- primes 503, 509, and 521</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d-smooth[30000..30019]: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">get_prime</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span><span style="color: #000000;">flat_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">nsmooth</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">30019</span><span style="color: #0000FF;">)[</span><span style="color: #000000;">30000</span><span style="color: #0000FF;">..</span><span style="color: #000000;">30019</span><span style="color: #0000FF;">])})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--

View file

@ -0,0 +1,81 @@
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
def isPrime(n):
if n < 2:
return False
for i in primes:
if n == i:
return True
if n % i == 0:
return False
if i * i > n:
return True
print "Oops,", n, " is too large"
def init():
s = 24
while s < 600:
if isPrime(s - 1) and s - 1 > primes[-1]:
primes.append(s - 1)
if isPrime(s + 1) and s + 1 > primes[-1]:
primes.append(s + 1)
s += 6
def nsmooth(n, size):
if n < 2 or n > 521:
raise Exception("n")
if size < 1:
raise Exception("n")
bn = n
ok = False
for prime in primes:
if bn == prime:
ok = True
break
if not ok:
raise Exception("must be a prime number: n")
ns = [0] * size
ns[0] = 1
next = []
for prime in primes:
if prime > bn:
break
next.append(prime)
indicies = [0] * len(next)
for m in xrange(1, size):
ns[m] = min(next)
for i in xrange(0, len(indicies)):
if ns[m] == next[i]:
indicies[i] += 1
next[i] = primes[i] * ns[indicies[i]]
return ns
def main():
init()
for p in primes:
if p >= 30:
break
print "The first", p, "-smooth numbers are:"
print nsmooth(p, 25)
print
for p in primes[1:]:
if p >= 30:
break
print "The 3000 to 3202", p, "-smooth numbers are:"
print nsmooth(p, 3002)[2999:]
print
for p in [503, 509, 521]:
print "The 30000 to 3019", p, "-smooth numbers are:"
print nsmooth(p, 30019)[29999:]
print
main()

View file

@ -0,0 +1,43 @@
[ behead 0 swap rot
witheach
[ 2dup < iff
drop done
nip nip
i^ 1+ swap ] ] is smallest ( [ --> n n )
[ stack ] is end.test ( --> s )
[ ]'[ end.test put
dup temp put
' [ 1 ]
0 rot size of
[ over end.test share do if done
[] unrot
dup dip
[ witheach
[ dip dup peek
temp share i^ peek *
rot swap join swap ] ]
rot smallest
dip
[ 2dup peek 1+ unrot poke ]
rot swap over
-1 peek over = iff
drop else join
swap again ]
drop
end.test release
temp release ] is smoothwith ( [ --> [ )
[ ' [ 2 3 5 7 11 13 17 19 23 29 ]
swap split drop ] is primes ( n --> [ )
10 times
[ i^ 1+ primes
smoothwith [ size 25 = ]
echo cr ]
cr
9 times
[ i^ 2 + primes
smoothwith [ size 3002 = ]
-3 split nip echo cr ]

View file

@ -0,0 +1,44 @@
/*REXX pgm computes&displays X n-smooth numbers; both X and N can be specified as ranges*/
numeric digits 200 /*be able to handle some big numbers. */
parse arg LOx HIx LOn HIn . /*obtain optional arguments from the CL*/
if LOx=='' | LOx=="," then LOx= 1 /*Not specified? Then use the default.*/
if HIx=='' | HIx=="," then HIx= LOx + 24 /* " " " " " " */
if LOn=='' | LOn=="," then LOn= 2 /* " " " " " " */
if HIn=='' | HIn=="," then HIn= LOn + 27 /* " " " " " " */
call genP HIn /*generate enough primes to satisfy HIn*/
@aList= ' a list of the '; @thru= ' through ' /*literals used with a SAY.*/
do j=LOn to HIn; if !.j==0 then iterate /*if not prime, then skip this number. */
call smooth HIx,j; $= /*invoke SMOOTH; initialize $ (list). */
do k=LOx to HIx; $= $ #.k /*append a smooth number to " " " */
end /*k*/
say center(@aList th(LOx) @thru th(HIx) ' numbers for' j"-smooth ", 130, "")
say strip($); say
end /*j*/ /* [↑] the $ list has a leading blank.*/
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
genP: procedure expose @. !. #; parse arg x /*#≡num of primes; @. ≡array of primes.*/
@.=; @.1=2; @.2=3; @.3=5; @.4=7; @.5=11; @.6=13; @.7=17; @.8=19; @.9=23; #=9
!.=0; !.2=1; !.3=2; !.5=3; !.7=4; !.11=5; !.13=6; !.17=7; !.19=8; !.23=9
do k=@.#+6 by 2 until #>=x ; if k//3==0 then iterate
parse var k '' -1 _; if _==5 then iterate
do d=4 until @.d**2>k; if k//@.d==0 then iterate k
end /*d*/
#= # + 1; !.k= #; @.#= k /*found a prime, bump counter; assign @*/
end /*k*/; return
/*──────────────────────────────────────────────────────────────────────────────────────*/
smooth: procedure expose @. !. #.; parse arg y,p /*obtain the arguments from the invoker*/
if p=='' then p= 3 /*Not specified? Then assume Hamming #s*/
n= !.p /*the number of primes being used. */
nn= n - 1; #.= 0; #.1= 1 /*an array of n-smooth numbers (so far)*/
f.= 1 /*the indices of factors of a number. */
do j=2 for y-1; _= f.1
z= @.1 * #._
do k=2 for nn; _= f.k; v= @.k * #._; if v<z then z= v
end /*k*/
#.j= z
do d=1 for n; _= f.d; if @.d * #._==z then f.d= f.d + 1
end /*d*/
end /*j*/; return
/*──────────────────────────────────────────────────────────────────────────────────────*/
th: parse arg th; return th || word('th st nd rd', 1+(th//10)*(th//100%10\==1)*(th//10<4))

View file

@ -0,0 +1,38 @@
sub smooth-numbers (*@list) {
cache my \Smooth := gather {
my %i = (flat @list) Z=> (Smooth.iterator for ^@list);
my %n = (flat @list) Z=> 1 xx *;
loop {
take my $n := %n{*}.min;
for @list -> \k {
%n{k} = %i{k}.pull-one * k if %n{k} == $n;
}
}
}
}
sub abbrev ($n) {
$n.chars > 50 ??
$n.substr(0,10) ~ "...({$n.chars - 20} digits omitted)..." ~ $n.substr(* - 10) !!
$n
}
my @primes = (2..*).grep: *.is-prime;
my $start = 3000;
for ^@primes.first( * > 29, :k ) -> $p {
put join "\n", "\nFirst 25, and {$start}th through {$start+2}nd {@primes[$p]}-smooth numbers:",
$(smooth-numbers(|@primes[0..$p])[^25]),
$(smooth-numbers(|@primes[0..$p])[$start - 1 .. $start + 1]».&abbrev);
}
$start = 30000;
for 503, 509, 521 -> $p {
my $i = @primes.first( * == $p, :k );
put "\n{$start}th through {$start+19}th {@primes[$i]}-smooth numbers:\n" ~
smooth-numbers(|@primes[0..$i])[$start - 1 .. $start + 18];
}

View file

@ -0,0 +1,54 @@
def prime?(n) # P3 Prime Generator primality test
return n | 1 == 3 if n < 5 # n: 2,3|true; 0,1,4|false
return false if n.gcd(6) != 1 # this filters out 2/3 of all integers
sqrtN = Integer.sqrt(n)
pc = -1 # initial P3 prime candidates value
until (pc += 6) > sqrtN # is resgroup 1st prime candidate > sqrtN
return false if n % pc == 0 || n % (pc + 2) == 0 # if n is composite
end
true
end
def gen_primes(a, b)
(a..b).select { |pc| pc if prime? pc }
end
def nsmooth(n, limit)
raise "Exception(n or limit)" if n < 2 || n > 521 || limit < 1
raise "Exception(must be a prime number: n)" unless prime? n
primes = gen_primes(2, n)
ns = [0] * limit
ns[0] = 1
nextp = primes[0..primes.index(n)]
indices = [0] * nextp.size
(1...limit).each do |m|
ns[m] = nextp.min
(0...indices.size).each do |i|
if ns[m] == nextp[i]
indices[i] += 1
nextp[i] = primes[i] * ns[indices[i]]
end
end
end
ns
end
gen_primes(2, 29).each do |prime|
print "The first 25 #{prime}-smooth numbers are: \n"
print nsmooth(prime, 25)
puts
end
puts
gen_primes(3, 29).each do |prime|
print "The 3000 to 3202 #{prime}-smooth numbers are: "
print nsmooth(prime, 3002)[2999..-1] # for ruby >= 2.6: (..)[2999..]
puts
end
puts
gen_primes(503, 521).each do |prime|
print "The 30,000 to 30,019 #{prime}-smooth numbers are: \n"
print nsmooth(prime, 30019)[29999..-1] # for ruby >= 2.6: (..)[29999..]
puts
end

View file

@ -0,0 +1,94 @@
fn is_prime(n: u32) -> bool {
if n < 2 {
return false;
}
if n % 2 == 0 {
return n == 2;
}
if n % 3 == 0 {
return n == 3;
}
let mut p = 5;
while p * p <= n {
if n % p == 0 {
return false;
}
p += 2;
if n % p == 0 {
return false;
}
p += 4;
}
true
}
fn find_primes(from: u32, to: u32) -> Vec<u32> {
let mut primes: Vec<u32> = Vec::new();
for p in from..=to {
if is_prime(p) {
primes.push(p);
}
}
primes
}
fn find_nsmooth_numbers(n: u32, count: usize) -> Vec<u128> {
let primes = find_primes(2, n);
let num_primes = primes.len();
let mut result = Vec::with_capacity(count);
let mut queue = Vec::with_capacity(num_primes);
let mut index = Vec::with_capacity(num_primes);
for i in 0..num_primes {
index.push(0);
queue.push(primes[i] as u128);
}
result.push(1);
for i in 1..count {
for p in 0..num_primes {
if queue[p] == result[i - 1] {
index[p] += 1;
queue[p] = result[index[p]] * primes[p] as u128;
}
}
let mut min_index: usize = 0;
for p in 1..num_primes {
if queue[min_index] > queue[p] {
min_index = p;
}
}
result.push(queue[min_index]);
}
result
}
fn print_nsmooth_numbers(n: u32, begin: usize, count: usize) {
let numbers = find_nsmooth_numbers(n, begin + count);
print!("{}: {}", n, &numbers[begin]);
for i in 1..count {
print!(", {}", &numbers[begin + i]);
}
println!();
}
fn main() {
println!("First 25 n-smooth numbers for n = 2 -> 29:");
for n in 2..=29 {
if is_prime(n) {
print_nsmooth_numbers(n, 0, 25);
}
}
println!();
println!("3 n-smooth numbers starting from 3000th for n = 3 -> 29:");
for n in 3..=29 {
if is_prime(n) {
print_nsmooth_numbers(n, 2999, 3);
}
}
println!();
println!("20 n-smooth numbers starting from 30,000th for n = 503 -> 521:");
for n in 503..=521 {
if is_prime(n) {
print_nsmooth_numbers(n, 29999, 20);
}
}
}

View file

@ -0,0 +1,23 @@
func smooth_generator(primes) {
var s = primes.len.of { [1] }
{
var n = s.map { .first }.min
{ |i|
s[i].shift if (s[i][0] == n)
s[i] << (n * primes[i])
} * primes.len
n
}
}
for p in (primes(2,29)) {
var g = smooth_generator(p.primes)
say ("First 25 #{'%2d'%p}-smooth numbers: ", 25.of { g.run }.join(' '))
}
say ''
for p in (primes(3,29)) {
var g = smooth_generator(p.primes)
say ("3,000th through 3,002nd #{'%2d'%p}-smooth numbers: ", 3002.of { g.run }.last(3).join(' '))
}

View file

@ -0,0 +1,18 @@
func is_smooth_over_prod(n, k) {
return true if (n == 1)
return false if (n <= 0)
for (var g = gcd(n,k); g > 1; g = gcd(n,k)) {
n /= g**valuation(n,g) # remove any divisibility by g
return true if (n == 1) # smooth if n == 1
}
return false
}
for p in (503, 509, 521) {
var k = p.primorial
var a = {|n| is_smooth_over_prod(n, k) }.first(30_019).last(20)
say ("30,000th through 30,019th #{p}-smooth numbers: ", a.join(' '))
}

View file

@ -0,0 +1,64 @@
import BigInt
import Foundation
extension BinaryInteger {
@inlinable
public var isPrime: Bool {
if self == 0 || self == 1 {
return false
} else if self == 2 {
return true
}
let max = Self(ceil((Double(self).squareRoot())))
for i in stride(from: 2, through: max, by: 1) {
if self % i == 0 {
return false
}
}
return true
}
}
@inlinable
public func smoothN<T: BinaryInteger>(n: T, count: Int) -> [T] {
let primes = stride(from: 2, to: n + 1, by: 1).filter({ $0.isPrime })
var next = primes
var indices = [Int](repeating: 0, count: primes.count)
var res = [T](repeating: 0, count: count)
res[0] = 1
guard count > 1 else {
return res
}
for m in 1..<count {
res[m] = next.min()!
for i in 0..<indices.count where res[m] == next[i] {
indices[i] += 1
next[i] = primes[i] * res[indices[i]]
}
}
return res
}
for n in 2...29 where n.isPrime {
print("The first 25 \(n)-smooth numbers are: \(smoothN(n: n, count: 25))")
}
print()
for n in 3...29 where n.isPrime {
print("The 3000...3002 \(n)-smooth numbers are: \(smoothN(n: BigInt(n), count: 3002).dropFirst(2999).prefix(3))")
}
print()
for n in 503...521 where n.isPrime {
print("The 30,000...30,019 \(n)-smooth numbers are: \(smoothN(n: BigInt(n), count: 30_019).dropFirst(29999).prefix(20))")
}

View file

@ -0,0 +1,55 @@
import "/math" for Int
import "/big" for BigInt, BigInts
// cache all primes up to 521
var smallPrimes = Int.primeSieve(521)
var primes = smallPrimes.map { |p| BigInt.new(p) }.toList
var nSmooth = Fn.new { |n, size|
if (n < 2 || n > 521) Fiber.abort("n must be between 2 and 521")
if (size < 1) Fiber.abort("size must be at least 1")
var bn = BigInt.new(n)
var ok = false
for (prime in primes) {
if (bn == prime) {
ok = true
break
}
}
if (!ok) Fiber.abort("n must be a prime number")
var ns = List.filled(size, null)
ns[0] = BigInt.one
var next = []
for (i in 0...primes.count) {
if (primes[i] > bn) break
next.add(primes[i])
}
var indices = List.filled(next.count, 0)
for (m in 1...size) {
ns[m] = BigInts.min(next)
for (i in 0...indices.count) {
if (ns[m] == next[i]) {
indices[i] = indices[i] + 1
next[i] = primes[i] * ns[indices[i]]
}
}
}
return ns
}
smallPrimes = smallPrimes.where { |p| p <= 29 }
for (i in smallPrimes) {
System.print("The first 25 %(i)-smooth numbers are:")
System.print(nSmooth.call(i, 25))
System.print()
}
for (i in smallPrimes.skip(1)) {
System.print("The 3,000th to 3,202nd %(i)-smooth numbers are:")
System.print(nSmooth.call(i, 3002)[2999..-1])
System.print()
}
for (i in [503, 509, 521]) {
System.print("The 30,000th to 30,019th %(i)-smooth numbers are:")
System.print(nSmooth.call(i, 30019)[29999..-1])
System.print()
}

View file

@ -0,0 +1,23 @@
var [const] BI=Import("zklBigNum"); // libGMP
fcn nSmooth(n,sz){ // --> List of big ints
if(sz<1) throw(Exception.ValueError("size must be at least 1"));
bn,primes,ns := BI(n), List(), List.createLong(sz);
if(not bn.probablyPrime()) throw(Exception.ValueError("n must be prime"));
p:=BI(1); while(p<n){ primes.append(p.nextPrime().copy()) } // includes n
ns.append(BI(1));
next:=primes.copy();
if(Void!=( z:=primes.find(bn)) ) next.del(z+1,*);
indices:=List.createLong(next.len(),0);
do(sz-1){
ns.append( nm:=BI( next.reduce(fcn(a,b){ a.min(b) }) ));
foreach i in (indices.len()){
if(nm==next[i]){
indices[i]+=1;
next[i]=primes[i]*ns[indices[i]];
}
}
}
ns
}

View file

@ -0,0 +1,15 @@
smallPrimes:=List();
p:=BI(1); while(p<29) { smallPrimes.append(p.nextPrime().toInt()) }
foreach p in (smallPrimes){
println("The first 25 %d-smooth numbers are:".fmt(p));
println(nSmooth(p,25).concat(" "), "\n")
}
foreach p in (smallPrimes[1,*]){
print("The 3,000th to 3,202nd %d-smooth numbers are: ".fmt(p));
println(nSmooth(p,3002)[2999,*].concat(" "));
}
foreach p in (T(503,509,521)){
println("\nThe 30,000th to 30,019th %d-smooth numbers are:".fmt(p));
println(nSmooth(p,30019)[29999,*].concat(" "));
}