more solutions in V
parent
6a0060567f
commit
79e1f45b8e
112
v/euler/euler.v
112
v/euler/euler.v
|
@ -64,3 +64,115 @@ pub fn palindrome(n int) bool {
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn check(n int, p int) []int {
|
||||||
|
mut result := []int
|
||||||
|
mut q := n / p
|
||||||
|
mut r := n % p
|
||||||
|
mut m := n
|
||||||
|
for r == 0 {
|
||||||
|
result << p
|
||||||
|
m = q
|
||||||
|
q = m / p
|
||||||
|
r = m % p
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn trial_division(n int) []int {
|
||||||
|
mut factors := []int
|
||||||
|
factors << check(n, 2)
|
||||||
|
factors << check(n, 3)
|
||||||
|
mut p := 5
|
||||||
|
for p * p <= n {
|
||||||
|
factors << check(n, p)
|
||||||
|
p += 2
|
||||||
|
factors << check(n, p)
|
||||||
|
p += 4
|
||||||
|
}
|
||||||
|
if factors.len == 0 { factors << n }
|
||||||
|
return factors
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn prime_factorization(n int) map[string]int {
|
||||||
|
mut result := map[string]int
|
||||||
|
factors := trial_division(n)
|
||||||
|
for f in factors {
|
||||||
|
result[f.str()] = 0
|
||||||
|
mut num := n
|
||||||
|
for num % f == 0 {
|
||||||
|
result[f.str()] = result[f.str()] + 1
|
||||||
|
num /= f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn eratosthenes_sieve(n int) []bool {
|
||||||
|
mut sieve := [true].repeat(n + 1)
|
||||||
|
sieve[0] = false
|
||||||
|
sieve[1] = false
|
||||||
|
|
||||||
|
for i := 2; i <= int(math.sqrt(n)); i++ {
|
||||||
|
if (sieve[i]) {
|
||||||
|
for j := i * i; j <= n; j += i {
|
||||||
|
sieve[j] = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sieve
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn eratosthenes_sieve_expand(n int, sieve []bool) []bool
|
||||||
|
{
|
||||||
|
mut new_sieve := sieve
|
||||||
|
for i := sieve.len + 1; i <= n + 1; i++ {
|
||||||
|
new_sieve << true
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 2; i <= int(math.sqrt(n)); i++ {
|
||||||
|
if (new_sieve[i]) {
|
||||||
|
mut start := i * i
|
||||||
|
if (i * i >= sieve.len) {
|
||||||
|
start = sieve.len + i - (sieve.len % i)
|
||||||
|
}
|
||||||
|
for j := start; j <= n; j += i {
|
||||||
|
new_sieve[j] = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_sieve
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn primes_up_to(n int) []int {
|
||||||
|
return primes_from_sieve(eratosthenes_sieve(n))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn count_primes_from_sieve(sieve []bool) int {
|
||||||
|
mut result := 0
|
||||||
|
for b in sieve { if b { result++ } }
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn primes_from_sieve(sieve []bool) []int {
|
||||||
|
mut result := []int
|
||||||
|
for index, b in sieve {
|
||||||
|
if b { result << index }
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn find_nth_prime(n int) int {
|
||||||
|
mut sieve_size := 16
|
||||||
|
mut sieve := eratosthenes_sieve(sieve_size)
|
||||||
|
|
||||||
|
for count_primes_from_sieve(sieve) < n {
|
||||||
|
sieve_size *= 2
|
||||||
|
sieve = eratosthenes_sieve_expand(sieve_size, sieve)
|
||||||
|
}
|
||||||
|
|
||||||
|
primes := primes_from_sieve(sieve)
|
||||||
|
return primes[n - 1]
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
import euler
|
||||||
|
import math
|
||||||
|
|
||||||
|
fn factorization_of_integer_divisible_by_all_integers_up_to(n int) map[string]int {
|
||||||
|
mut result := map[string]int
|
||||||
|
for i in euler.range(2, n) {
|
||||||
|
for p, e in euler.prime_factorization(i) {
|
||||||
|
if !(p in result) || e > result[p] {
|
||||||
|
result[p] = e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn factors_to_int(factorization map[string]int) int {
|
||||||
|
mut result := 1
|
||||||
|
for p, e in factorization {
|
||||||
|
result *= int(math.pow(p.int(), e))
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println(factors_to_int(factorization_of_integer_divisible_by_all_integers_up_to(20)))
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
import euler
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
range := euler.range(1, 100)
|
||||||
|
sum := range.reduce(euler.add, 0)
|
||||||
|
square_of_sum := sum * sum
|
||||||
|
sum_of_squares := range.map(it * it).reduce(euler.add, 0)
|
||||||
|
println(square_of_sum - sum_of_squares)
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
import euler
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println(euler.find_nth_prime(10001))
|
||||||
|
}
|
Loading…
Reference in New Issue