Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
31
Task/Hamming-numbers/Wren/hamming-numbers-1.wren
Normal file
31
Task/Hamming-numbers/Wren/hamming-numbers-1.wren
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
import "/big" for BigInt, BigInts
|
||||
|
||||
var primes = [2, 3, 5].map { |p| BigInt.new(p) }.toList
|
||||
|
||||
var hamming = Fn.new { |size|
|
||||
if (size < 1) Fiber.abort("size must be at least 1")
|
||||
var ns = List.filled(size, null)
|
||||
ns[0] = BigInt.one
|
||||
var next = primes.toList
|
||||
var indices = List.filled(3, 0)
|
||||
for (m in 1...size) {
|
||||
ns[m] = BigInts.min(next)
|
||||
for (i in 0..2) {
|
||||
if (ns[m] == next[i]) {
|
||||
indices[i] = indices[i] + 1
|
||||
next[i] = primes[i] * ns[indices[i]]
|
||||
}
|
||||
}
|
||||
}
|
||||
return ns
|
||||
}
|
||||
|
||||
var h = hamming.call(1e6)
|
||||
System.print("The first 20 Hamming numbers are:")
|
||||
System.print(h[0..19])
|
||||
System.print()
|
||||
System.print("The 1,691st Hamming number is:")
|
||||
System.print(h[1690])
|
||||
System.print()
|
||||
System.print("The 1,000,000th Hamming number is:")
|
||||
System.print(h[999999])
|
||||
63
Task/Hamming-numbers/Wren/hamming-numbers-2.wren
Normal file
63
Task/Hamming-numbers/Wren/hamming-numbers-2.wren
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
import "./dynamic" for Struct
|
||||
import "./long" for ULong
|
||||
import "./big" for BigInt
|
||||
import "./math" for Math
|
||||
|
||||
var Logrep = Struct.create("LogRep", ["lg", "x2", "x3", "x5"])
|
||||
|
||||
var nthHamming = Fn.new { |n|
|
||||
if (n < 2) {
|
||||
if (n < 1) Fiber.abort("nthHamming: argument is zero!")
|
||||
return [0, 0, 0]
|
||||
}
|
||||
var lb3 = 1.5849625007211561814537389439478
|
||||
var lb5 = 2.3219280948873623478703194294894
|
||||
var fctr = 6 * lb3 * lb5
|
||||
var crctn = 2.4534452978042592646620291867186
|
||||
var lgest = (n.toNum * fctr).cbrt - crctn
|
||||
var frctn = (n < 1000000000) ? 0.509 : 0.106
|
||||
var lghi = ((n.toNum + lgest * frctn) * fctr).cbrt - crctn
|
||||
var lglo = lgest * 2 - lghi
|
||||
var count = ULong.zero
|
||||
var bnd = []
|
||||
var klmt = (lghi/lb5).truncate.abs + 1
|
||||
for (k in 0...klmt) {
|
||||
var p = k * lb5
|
||||
var jlmt = ((lghi - p)/lb3).truncate.abs + 1
|
||||
for (j in 0...jlmt) {
|
||||
var q = p + j * lb3
|
||||
var ir = lghi - q
|
||||
var lg = q + ir.floor
|
||||
count = count + ir.truncate.abs + 1
|
||||
if (lg >= lglo) bnd.add(Logrep.new(lg, ir.truncate.abs, j, k))
|
||||
}
|
||||
}
|
||||
if (n > count) Fiber.abort("nthHamming: band high estimate is too low!")
|
||||
var ndx = (count - n).toSmall
|
||||
if (ndx >= bnd.count) Fiber.abort("nthHamming: band low estimate is too high!")
|
||||
bnd.sort { |a, b| b.lg < a.lg }
|
||||
var rslt = bnd[ndx]
|
||||
return [rslt.x2, rslt.x3, rslt.x5]
|
||||
}
|
||||
|
||||
var convertTpl2BigInt = Fn.new { |tpl|
|
||||
var result = BigInt.one
|
||||
for (i in 0...tpl[0]) result = result * 2
|
||||
for (i in 0...tpl[1]) result = result * 3
|
||||
for (i in 0...tpl[2]) result = result * 5
|
||||
return result
|
||||
}
|
||||
|
||||
System.print("The first 20 Hamming numbers are:")
|
||||
for (i in 1..20) {
|
||||
System.write("%(convertTpl2BigInt.call(nthHamming.call(ULong.new(i)))) ")
|
||||
}
|
||||
System.print("\n\nThe 1,691st Hamming number is:")
|
||||
System.print(convertTpl2BigInt.call(nthHamming.call(ULong.new(1691))))
|
||||
var start = System.clock
|
||||
var res = nthHamming.call(ULong.new(1e6))
|
||||
var end = System.clock
|
||||
System.print("\nThe 1,000,000 Hamming number is:")
|
||||
System.print(convertTpl2BigInt.call(res))
|
||||
var duration = ((end-start) * 1000).round
|
||||
System.print("The last of these found in %(duration) milliseconds.")
|
||||
Loading…
Add table
Add a link
Reference in a new issue