裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

「電卓」の仕様(その2)

2016年01月14日 | ブログラミング

Java に BigDecimal というのがあるのを知っていたので,どうせ BigInteger というのもあるだろうと,門前の小僧が習わぬ経を詠んでみたという話

ideon.com でやってみた。試行錯誤の末。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

整数方程式

2016年01月14日 | ブログラミング

締め切りが 2016/1/14 10:00 AM なので,その 1 分後に公開されるように予約投稿する

2つの自然数の組 (a, b) が与えられたとき、自然数 x, y に関する次の方程式を考えます。
    x2 + a2 = y2 + b2 … (※)
例えば、(a, b) = (3, 10) のとき、方程式(※)の解は (x, y) = (10, 3), (46, 45) の 2 組です。
自然数の組 (a, b) に対し、方程式(※)の全ての解の x + y の和を F(a, b) と定義します。
例えば F(3, 10) = 10 + 3 + 46 + 45 = 104 です。
同様に、F(10, 50) = 3500、F(20, 100) = 15022 となることが確かめられます。
標準入力から、半角空白区切りで 2 つの自然数 a, b(1 ≦ a < b ≦ 105)が与えられます。
標準出力に F(a, b) の値を出力するプログラムを書いてください。

探索範囲を効率的に定めて,ブルートフォースで片付ける

f = function(a, b) {
    s = 0
    b2a2 = b^2-a^2
    xmy = 2 - (b2a2 %% 2)
    repeat {
        xpy = b2a2 %/% xmy
        if (xmy*xpy == b2a2) {
            x = (xmy+xpy)/2
            y = xpy-x
            if (x == floor(x) && y > 0) {
                s = s+x+y
            }
        }
        if (xmy >= xpy) break
        xmy = xmy+2
    }
    cat(s)
}


f(3, 10) # 104
f(10, 50) # 3500
f(20, 100) # 15022
f(10, 26) # 716
f(11, 389) # 291886
f(123, 456) # 294166
f(35672, 61243) # 5082405064
f(71200, 82321) # 2490724704
f(19126, 98765) # 16043311668

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村