Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
3
Task/N-smooth-numbers/00-META.yaml
Normal file
3
Task/N-smooth-numbers/00-META.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
from: http://rosettacode.org/wiki/N-smooth_numbers
|
||||
note: Prime Numbers
|
||||
53
Task/N-smooth-numbers/00-TASK.txt
Normal file
53
Task/N-smooth-numbers/00-TASK.txt
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
'''n-smooth''' numbers are positive integers which have no prime factors <big> > </big> '''n'''.
|
||||
|
||||
The '''n''' in the expression '''n-smooth''' is always prime;
|
||||
<br>there are <u>no</u> '''9-smooth''' numbers.
|
||||
|
||||
'''1''' (unity) is always included in n-smooth numbers.
|
||||
|
||||
|
||||
<br>2-smooth numbers are non-negative powers of two.
|
||||
<br>5-smooth numbers are also called [[Hamming numbers]].
|
||||
<br>7-smooth numbers are also called [[humble numbers]].
|
||||
|
||||
|
||||
|
||||
A way to express 11-smooth numbers is:
|
||||
|
||||
<big><big> 11-smooth = 2<sup>i</sup> × 3<sup>j</sup> × 5<sup>k</sup> × 7<sup>m</sup> × 11<sup>p</sup></big></big>
|
||||
|
||||
where <big> i, j, k, m, p ≥ 0 </big>
|
||||
|
||||
|
||||
;Task:
|
||||
:* calculate and show the first '''25''' n-smooth numbers for '''n=2''' ───► '''n=29'''
|
||||
:* calculate and show three numbers starting with '''3,000''' n-smooth numbers for '''n=3''' ───► '''n=29'''
|
||||
:* calculate and show twenty numbers starting with '''30,000''' n-smooth numbers for '''n=503''' ───► '''n=521''' (optional)
|
||||
|
||||
|
||||
All ranges (for '''n''') are to be inclusive, and only prime numbers are to be used.
|
||||
<br>The (optional) n-smooth numbers for the third range are: '''503''', '''509''', and '''521'''.
|
||||
<br>Show all n-smooth numbers for any particular '''n''' in a horizontal list.
|
||||
<br>Show all output here on this page.
|
||||
|
||||
|
||||
;Related tasks:
|
||||
:* [[Hamming numbers]]
|
||||
:* [[humble numbers]]
|
||||
|
||||
|
||||
;References:
|
||||
:* Wikipedia entry: [[wp:Hamming numbers|Hamming numbers]] (this link is re-directed to '''Regular number''').
|
||||
:* Wikipedia entry: [[wp:Smooth number|Smooth number]]
|
||||
:* OEIS entry: [[oeis:A000079|A000079 2-smooth numbers or non-negative powers of two]]
|
||||
:* OEIS entry: [[oeis:A003586|A003586 3-smooth numbers]]
|
||||
:* Mintz 1981: [https://www.fq.math.ca/Scanned/19-4/mintz.pdf 3-smooth numbers]
|
||||
:* OEIS entry: [[oeis:A051037|A051037 5-smooth numbers or Hamming numbers]]
|
||||
:* OEIS entry: [[oeis:A002473|A002473 7-smooth numbers or humble numbers]]
|
||||
:* OEIS entry: [[oeis:A051038|A051038 11-smooth numbers]]
|
||||
:* OEIS entry: [[oeis:A080197|A080197 13-smooth numbers]]
|
||||
:* OEIS entry: [[oeis:A080681|A080681 17-smooth numbers]]
|
||||
:* OEIS entry: [[oeis:A080682|A080682 19-smooth numbers]]
|
||||
:* OEIS entry: [[oeis:A080683|A080683 23-smooth numbers]]
|
||||
<br><br>
|
||||
|
||||
76
Task/N-smooth-numbers/11l/n-smooth-numbers.11l
Normal file
76
Task/N-smooth-numbers/11l/n-smooth-numbers.11l
Normal 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()
|
||||
133
Task/N-smooth-numbers/C++/n-smooth-numbers.cpp
Normal file
133
Task/N-smooth-numbers/C++/n-smooth-numbers.cpp
Normal 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;
|
||||
}
|
||||
140
Task/N-smooth-numbers/C-sharp/n-smooth-numbers.cs
Normal file
140
Task/N-smooth-numbers/C-sharp/n-smooth-numbers.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
126
Task/N-smooth-numbers/C/n-smooth-numbers.c
Normal file
126
Task/N-smooth-numbers/C/n-smooth-numbers.c
Normal 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;
|
||||
}
|
||||
56
Task/N-smooth-numbers/Crystal/n-smooth-numbers.crystal
Normal file
56
Task/N-smooth-numbers/Crystal/n-smooth-numbers.crystal
Normal 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
|
||||
119
Task/N-smooth-numbers/D/n-smooth-numbers.d
Normal file
119
Task/N-smooth-numbers/D/n-smooth-numbers.d
Normal 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;
|
||||
}
|
||||
}
|
||||
196
Task/N-smooth-numbers/Delphi/n-smooth-numbers.delphi
Normal file
196
Task/N-smooth-numbers/Delphi/n-smooth-numbers.delphi
Normal 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.
|
||||
151
Task/N-smooth-numbers/Elm/n-smooth-numbers.elm
Normal file
151
Task/N-smooth-numbers/Elm/n-smooth-numbers.elm
Normal 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
|
||||
}
|
||||
52
Task/N-smooth-numbers/F-Sharp/n-smooth-numbers-1.fs
Normal file
52
Task/N-smooth-numbers/F-Sharp/n-smooth-numbers-1.fs
Normal 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)
|
||||
86
Task/N-smooth-numbers/F-Sharp/n-smooth-numbers-2.fs
Normal file
86
Task/N-smooth-numbers/F-Sharp/n-smooth-numbers-2.fs
Normal 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)
|
||||
39
Task/N-smooth-numbers/Factor/n-smooth-numbers.factor
Normal file
39
Task/N-smooth-numbers/Factor/n-smooth-numbers.factor
Normal 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
|
||||
147
Task/N-smooth-numbers/Free-Pascal/n-smooth-numbers.pas
Normal file
147
Task/N-smooth-numbers/Free-Pascal/n-smooth-numbers.pas
Normal 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.
|
||||
99
Task/N-smooth-numbers/Go/n-smooth-numbers.go
Normal file
99
Task/N-smooth-numbers/Go/n-smooth-numbers.go
Normal 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")
|
||||
}
|
||||
}
|
||||
30
Task/N-smooth-numbers/Haskell/n-smooth-numbers.hs
Normal file
30
Task/N-smooth-numbers/Haskell/n-smooth-numbers.hs
Normal 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)
|
||||
10
Task/N-smooth-numbers/J/n-smooth-numbers.j
Normal file
10
Task/N-smooth-numbers/J/n-smooth-numbers.j
Normal 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.
|
||||
)
|
||||
104
Task/N-smooth-numbers/Java/n-smooth-numbers.java
Normal file
104
Task/N-smooth-numbers/Java/n-smooth-numbers.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
48
Task/N-smooth-numbers/JavaScript/n-smooth-numbers.js
Normal file
48
Task/N-smooth-numbers/JavaScript/n-smooth-numbers.js
Normal 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)
|
||||
60
Task/N-smooth-numbers/Jq/n-smooth-numbers.jq
Normal file
60
Task/N-smooth-numbers/Jq/n-smooth-numbers.jq
Normal 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
|
||||
30
Task/N-smooth-numbers/Julia/n-smooth-numbers.julia
Normal file
30
Task/N-smooth-numbers/Julia/n-smooth-numbers.julia
Normal 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()
|
||||
93
Task/N-smooth-numbers/Kotlin/n-smooth-numbers.kotlin
Normal file
93
Task/N-smooth-numbers/Kotlin/n-smooth-numbers.kotlin
Normal 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()
|
||||
}
|
||||
}
|
||||
47
Task/N-smooth-numbers/Mathematica/n-smooth-numbers.math
Normal file
47
Task/N-smooth-numbers/Mathematica/n-smooth-numbers.math
Normal 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]]
|
||||
62
Task/N-smooth-numbers/Nim/n-smooth-numbers.nim
Normal file
62
Task/N-smooth-numbers/Nim/n-smooth-numbers.nim
Normal 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 ""
|
||||
15
Task/N-smooth-numbers/PARI-GP/n-smooth-numbers.parigp
Normal file
15
Task/N-smooth-numbers/PARI-GP/n-smooth-numbers.parigp
Normal 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])]];
|
||||
61
Task/N-smooth-numbers/Perl/n-smooth-numbers.pl
Normal file
61
Task/N-smooth-numbers/Perl/n-smooth-numbers.pl
Normal 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;
|
||||
}
|
||||
38
Task/N-smooth-numbers/Phix/n-smooth-numbers.phix
Normal file
38
Task/N-smooth-numbers/Phix/n-smooth-numbers.phix
Normal 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>
|
||||
<!--
|
||||
81
Task/N-smooth-numbers/Python/n-smooth-numbers.py
Normal file
81
Task/N-smooth-numbers/Python/n-smooth-numbers.py
Normal 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()
|
||||
43
Task/N-smooth-numbers/Quackery/n-smooth-numbers.quackery
Normal file
43
Task/N-smooth-numbers/Quackery/n-smooth-numbers.quackery
Normal 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 ]
|
||||
44
Task/N-smooth-numbers/REXX/n-smooth-numbers.rexx
Normal file
44
Task/N-smooth-numbers/REXX/n-smooth-numbers.rexx
Normal 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))
|
||||
38
Task/N-smooth-numbers/Raku/n-smooth-numbers.raku
Normal file
38
Task/N-smooth-numbers/Raku/n-smooth-numbers.raku
Normal 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];
|
||||
}
|
||||
54
Task/N-smooth-numbers/Ruby/n-smooth-numbers.rb
Normal file
54
Task/N-smooth-numbers/Ruby/n-smooth-numbers.rb
Normal 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
|
||||
94
Task/N-smooth-numbers/Rust/n-smooth-numbers.rust
Normal file
94
Task/N-smooth-numbers/Rust/n-smooth-numbers.rust
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
23
Task/N-smooth-numbers/Sidef/n-smooth-numbers-1.sidef
Normal file
23
Task/N-smooth-numbers/Sidef/n-smooth-numbers-1.sidef
Normal 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(' '))
|
||||
}
|
||||
18
Task/N-smooth-numbers/Sidef/n-smooth-numbers-2.sidef
Normal file
18
Task/N-smooth-numbers/Sidef/n-smooth-numbers-2.sidef
Normal 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(' '))
|
||||
}
|
||||
64
Task/N-smooth-numbers/Swift/n-smooth-numbers.swift
Normal file
64
Task/N-smooth-numbers/Swift/n-smooth-numbers.swift
Normal 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))")
|
||||
}
|
||||
55
Task/N-smooth-numbers/Wren/n-smooth-numbers.wren
Normal file
55
Task/N-smooth-numbers/Wren/n-smooth-numbers.wren
Normal 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()
|
||||
}
|
||||
23
Task/N-smooth-numbers/Zkl/n-smooth-numbers-1.zkl
Normal file
23
Task/N-smooth-numbers/Zkl/n-smooth-numbers-1.zkl
Normal 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
|
||||
}
|
||||
15
Task/N-smooth-numbers/Zkl/n-smooth-numbers-2.zkl
Normal file
15
Task/N-smooth-numbers/Zkl/n-smooth-numbers-2.zkl
Normal 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(" "));
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue