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