裏 RjpWiki

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

R で ペル方程式,Pell's equation

2021年06月16日 | ブログラミング

Mac OS Catalina,  バージョン 10.15.7 で gmp 0.6−2 が動かない。爆弾(エラー)が出る。

いろいろ探して,

M1チップ搭載のMacだとRのgmpパッケージが動かない?
https://rion778.hatenablog.com/entry/2021/03/02/214104

に,

install.packages("gmp", type = "source")

とすればよいと書いてあった。
私のマシンはポンコツなので,M1 なんかでないけど,とにかくやってみたら,動くようになった。

やってみたかったのは,R での Pell's equation プログラムを確かめることだ。

Pell's equation
https://rosettacode.org/wiki/Pell%27s_equation

ここには,いろいろな言語で書かれた,ペル方程式の解を求めるプログラムがのっているが,R によるプログラムがないので,以下のように翻訳してみた。
a, b = b, c みたいな構文がないのでちょっとダサいプログラムになる。

library(gmp)
pell = function(n) {
    x = as.bigz(floor(sqrt(n)))
    y = x
    z = 1
    r = 2 * x
    e1 = 1
    e2 = 0
    f1 = 0
    f2 = 1
    while(TRUE) {
        y = r * z - y
        z = (n - y * y) %/% z
        r = (x + y) %/% z
        temp = e1
        e1 = e2
        e2 = e2 * r + temp
        temp = f1
        f1 = f2
        f2 = f2 * r + temp
        a = f2
        b = e2
        temp = b
        b = a
        a = a * x + temp
        if (a * a - n * b * b == 1) {
            return(c(a, b))
        }
    }
}

pell(61)
# Big Integer ('bigz') object of length 2:
# [1] 1766319049 226153980

as.bigz("1766319049")^2 - 61 * as.bigz("226153980")^2
# 1

pell(109)
# Big Integer ('bigz') object of length 2:
# [1] 158070671986249 15140424455100

pell(181)
# Big Integer ('bigz') object of length 2:
# [1] 2469645423824185801 183567298683461940

pell(277)
# Big Integer ('bigz') object of length 2:
# [1] 159150073798980475849 9562401173878027020

無事に動いているようだ。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 図形問題の解(その 2) | トップ | 自由落下の危険性 »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事