裏 RjpWiki

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

Julia で統計解析--その1 さあ,始めよう!!Julia

2022年01月17日 | 統計学

これらの文書群は github で管理することとした

最新バージョン 2022-01-26 22:55

以下を参照のこと

https://r-de-r.github.io/stats/Julia-stats1.html

1. Julia を使ってみる
    1.1. 必要なファイルをダウンロードする
    1.2. Julia のインストール
    1.3. Julia を起動し終了する
    1.4. 作業ディレクトリを変える
    1.5. Julia の環境設定をする
        1.5.1. startup.jl ファイルがあるかを確認
        1.5.2. config がなかった場合
        1.5.3. startup.jl がある場合
        1.5.4. 変更内容の確認
1.6. オンラインヘルプを使う
1.7. パッケージを利用する
1.8. エディタを使う
    1.8.1. Atom
    1.8.2. Jupyter lab
1.9. 結果を保存する

 

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

無駄をなくさないと速くならないこともある

2022年01月17日 | ブログラミング

前と同じようなプログラムになると思うと大間違いな場合。

平成 26 年度 京都数学オリンピック道場
10 桁の正の整数の各桁に 0 以上 9 以下のすべての整数が現れ,かつ 11111 の倍数であるとき,その整数を面白い整数と呼ぶことにする。面白い整数は全部でいくつあるか。

今回も「前と同じだ!」と,1 ずつ引いていくと大変なことになるのは目に見えているのに,

function func11()
    num = 9876543210
    cnt = 0
    for i in num:-1:1023456789
        if i%11111 == 0 && length(Set(string(i))) == 10
            cnt += 1
        end
    end
    print(cnt)
end
@time func11() # 3456  4.728315 seconds

ほらね。言ったとおりでしょ?
1 ずつ引く意味がないのに。

11111 ずつ引きましょう。

function func12()
    num = 9876543210 ÷ 11111 * 11111
    cnt = 0
    for i in num:-11111:1023456789
        length(Set(string(i))) == 10 && (cnt += 1)
    end
    print(cnt)
end
@time func12() # 3456  0.147158 seconds

無駄な引き算を繰り返さないので,30 倍速になりました。

なお,func11() があまりにも遅いので,「0~9 の順列を作って,数字を連結して数を作り,その数が 1000000000 より大きくて,かつ,11111 で割り切れる場合の数を数えよう」として,

using Combinatorics
function func13()
    cnt = 0
    a = collect(0:9)
    j = 0
    for i in 1:factorial(length(a))
        num = parse(Int, join(nthperm(a, i)))
        num > 1000000000 && num % 11111 == 0 && (cnt += 1)
    end
    println(cnt)
end

を呈示している。しかし,10! = 3628800 通りもの順列の数字を連結したりするのは結構時間がかかる。
しかも,そのうちの 10%(362880個)が 0 で始まる数なのでふるい落とさねばならない。

結局実行時間は

@time func13() # 3456  2.609802 seconds

という情けない結果になってしまう。

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

計算はたいして速くならないけど,無駄をなくす

2022年01月17日 | ブログラミング

2016年ジュニア数学オリンピック予選「各桁の数字が相異なるような37の倍数のうち最大のものを求めよ。」

「10 桁の数の最大のものは 9876543210 なので,1ずつ引いてその数が37で割り切れ,かつ数字が相異なるか調べる」という戦略で,以下のようなプログラムが示されている。

function func1()
    num = 9876543210
    for i in num:-1:1
        if i%37 == 0 && length(Set(string(i))) == 10
            print(i)
            return
        end
    end
end

しかし,1 ずつ引いても,37 回目ごとにしか 37 の倍数にはならない。最大の 37 の倍数から始めて 37 ずつ引くのが妥当。大差はないが,塵も積もればということもあるから。

function func2()
    num = 9876543210 ÷ 37 * 37
    for i in num:-37:37
        length(Set(string(i))) == 10 && (println(i); return)
    end
end

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

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

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