Comment detail
exp(pi * sqrt(n))が整数に近くなるnを探す (Nested Flatten)
便乗。このライブラリは重宝しそう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function doukaku60(){ // 精度的に 58 が限界。
with(Math) for(var r = [], f, n = 1; n < 200; n++)
if(abs((f = exp(PI * sqrt(n))) - round(f)) < 1e-4) r.push([n, f]);
return r;
}
// ↓ Apfloat を用いて書き換え //
function doukaku60_(){
var F = Packages.org.apfloat.Apfloat;
var M = Packages.org.apfloat.ApfloatMath;
for(var r = [], p = 25, h = new F(0.5, p), f, n = 1; n < 200; n++){
f = M.exp(M.pi(p).multiply(M.sqrt(new F(n, p))));
if(M.abs(f.subtract(f.add(h).floor())).floatValue() < 1e-4) r.push([n, f.toString(true)]);
}
return r;
}
print(doukaku60_().join('\n'))
|




yuin
#3023()
[
Scala
]
Rating2/2=1.00
Apfloatを使いました。
それだけじゃ何も芸がない感じだったので、implicitでApfloatをあまり意識せずに書ける様にしました。
see: Apfloat
import org.apfloat._ import scala.runtime._ object findAlmostInt { implicit def toApfloat[A <: AnyVal](i:A):Apfloat = { new Apfloat(i.toString, 32) } implicit def toDouble(i:Apfloat):RichDouble = i.doubleValue.toDouble val PI = ApfloatMath.pi(32) def apply(i:int, j:int) = { (i to j-1).filter{n => val x = ApfloatMath.exp(PI.multiply(ApfloatMath.sqrt(n))) val y = x.ceil.subtract(x) (if(y<0.5){y}else{1.subtract(y)}).abs < 0.0001 }.toList } } println(findAlmostInt(1,200))Rating2/2=1.00-0+
1 reply [ reply ]