以下の内容はhttps://inamori.hateblo.jp/entry/2025/01/22/204337より取得しました。


MojoでProject Euler 94

https://projecteuler.net/problem=94

二等辺三角形なので、直角三角形を二つ合わせたものです。なので、その直角三角形を
 a = l(m^2-n^2)\ b = 2lmn\ c = l(m^2+n^2)
とすると、
 c = 2a \pm 1

 c = 2b \pm 1
となります。どちらでも l = 1となって、前者は、
 m^2 - 3n^2 = \pm 1
で、4の剰余を考えると、
 m^2 - 3n^2 = 1
しかないです。これはPell方程式です。また後者なら、
 m^2 + n^2 = 4mn \pm 1
ですが、これは、
 (m - 2n)^2 - 3n^2 = 1
で、これもPell方程式です。

import sys


#################### process ####################

fn next_solution(z: Tuple[Int, Int]) -> Tuple[Int, Int]:
    var x = z.get[0, Int]()
    var y = z.get[1, Int]()
    return (2*x + 3*y, x + 2*y)

# m^2 - 3n^2 = 1
fn f1(N: Int) -> Int:
    var sum_p = 0
    var z = (2, 1)
    while True:
        var m = z.get[0, Int]()
        var n = z.get[1, Int]()
        var p = 4*m*m
        if p > N:
            break
        sum_p += p
        z = next_solution(z)
    return sum_p

# m^2 + n^2 - 4mn = 1
fn f2(N: Int) -> Int:
    var sum_p = 0
    var z = (7, 4)
    while True:
        var x = z.get[0, Int]()
        var m = z.get[1, Int]()
        var n = 2*m-x
        var p = 2*(m+n)**2
        if p > N:
            break
        sum_p += p
        z = next_solution(z)
    return sum_p

fn f(E: Int) -> Int:
    var N = 10**E
    return f1(N) + f2(N)

fn main() raises:
    var args = sys.argv()
    var E = atol(args[1])
    print(f(E))



以上の内容はhttps://inamori.hateblo.jp/entry/2025/01/22/204337より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14