Comment detail

exp(pi * sqrt(n))が整数に近くなるnを探す (Nested Flatten)

Apfloatを使いました。

それだけじゃ何も芸がない感じだったので、implicitでApfloatをあまり意識せずに書ける様にしました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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))
 便乗。このライブラリは重宝しそう。
 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'))

Index

Feed

Other

Link

Pathtraq

loading...