Swift – DECODE https://decode.red/blog data decode, decoder or decoded ... design of code Mon, 15 Dec 2025 06:15:00 +0000 ja hourly 1 https://wordpress.org/?v=4.7.29 Langlands Program ../../../20160218527/ Wed, 17 Feb 2016 15:24:08 +0000 ../../../?p=527 エドワード・フレンケル「数学の大統一に挑む」(Love and Math -The Heart of Hidden Reality-)の中で語られているある数式にとても興味を持ち、プログラムによって確認してみました。
ハリウッド俳優のようなルックスの著者は、数学の教授で、NHKの白熱教室でもこの数式に関してとても興奮して語っていたのがとても印象的でした。
フェルマーの最終定理の証明することとなった、志村・谷山・ヴェイユ予想はラングランズ・ブログラムの特殊ケースといわれ、ある方程式を解くことで、その不思議なつながりを体験することができると解釈しました。
番組ではこの日本人数学者のエピソードも語られ、その偉大さを初めて知りました。

演算に関してだけ簡単に説明すると、

y^2 + y = x^3 – x^2

この方程式と

q * (1-q)^2 * (1-q^11)^2 * (1-q^2)^2 * (1-q^22)^2 * (1-q^3)^2 * (1-q^33)^2 * (1-q^4)^2 * (1-q^44)^2 …..

という規則性のある式は、元々全く関係のないものですが、前者の式の解の個数と後者の式を展開した時の係数が一致するというものです。
プログラムでは、前者を素数を法とする数で総当たりに解を導きます。後者は数式を展開し係数を取得します。
前者は、数が大きくなればなるほど、計算コストがかかるのに、後者はそれを数式の展開という形で導き出してしまう、ということがとても不思議な部分です。
前者はSwiftで、後者はOctaveで計算しました。

Swiftでは、まず素数列を取得しそれから各素数に対して、方程式を解きます。
素数から解の個数を引いた値と、Octaveで演算した素数番目の係数と見比べます。

素数
3,5,7,11,13,17,19,23,29,31,37

解の個数
4,4,9,10,9,19,19,24,29,24,34

(素数)-(解の個数)
-1,1,-2,1,4,-2,0,-1,0,7,3

prime01

Octaveでは、

a1 = [1 0];
function ret = insz(s)
  A = [-1];
  for i = 1:s
    A = [A, 0];
  endfor
  A = [A, 1];
  ret = A;
endfunction
for i = 1:37
        r = insz(i-1);
        a1 = conv(a1, r);
        a1 = conv(a1, r);
        r2 = insz(i*11 - 1);
        a1 = conv(a1, r2);
        a1 = conv(a1, r2);
endfor
disp(a1)

このプログラムにより、係数だけの演算をします。insz関数はゼロを配列の真ん中に挿入しています。
[1 1] -> x + 1
[1 0 1] -> x^2 + 1
[1 0 0 1] -> x^3 + 1
といった具合です。

octave01

しくみがシンプルなだけにこの結果に驚かされます。
このような現象が、まだまだたくさん隠されているということなのでしようね。
– Hidden Reality –

(数学者って憧れます)

]]>
Kalman Filter ../../../20160124520/ Sun, 24 Jan 2016 13:57:17 +0000 ../../../?p=520 カルマンフィルタという、誤差のある観測データから真の値を推測する手法を、Playgroundでテストしてみました。

参考:
http://sinhrks.hatenablog.com/entry/2014/11/01/231333
http://scipy.github.io/old-wiki/pages/Cookbook/KalmanFiltering
http://www.sat.t.u-tokyo.ac.jp/~omi/random_variables_generation.html#Gauss

環境: Xcode 7.2 / Mac OSX 10.10.5

import UIKit

let n = 300

let Q = 1e-5
let R = pow(0.1, 2)

var xhat = [Double](count: n, repeatedValue: 0)
var xhatminus = [Double](count: n, repeatedValue: 0)
var P = [Double](count: n, repeatedValue: 0)
var K = [Double](count: n, repeatedValue: 0)
var Pminus = [Double](count: n, repeatedValue: 0)

func norm(x:Double, _ mu:Double, _ si:Double) -> Double{
    return 1.0 / sqrt(2 * M_PI * si) * exp(-0.5 * (x - mu) * (x - mu) / si)
}

for var d = -2.0; d < 2.0; d += 0.1 {
    norm(d, 0, 1.0)
    norm(d, 0, 0.2)
    norm(d, 1, 0.2)
    
}

func rand() -> Double {
    return Double(arc4random_uniform(1000) + 1) / Double(1000 + 2)
}
func rand_normal(mu: Double, _ si: Double) -> Double {
    let z:Double = sqrt( -2.0 * log(rand()) ) * sin( 2.0 * M_PI * rand() );
    return mu + si * z;
}

var max = 0.0
var min = 1.0
var h = [Int](count: 10, repeatedValue: 0)

var z:[Double] = []

let  TrueValue = 3.0

for _ in 0..<n {
    let r = rand_normal(TrueValue, 1.0)
    
    if r > max {
        max = r
    }
    if r < min {
        min = r
    }
    z.append(r)
    
    if r < -3 {
        h[0] += 1
    } else if -3 <= r && r < -2 {
        h[1] += 1
    } else if -2 <= r && r < -1 {
        h[2] += 1
    } else if -1 <= r && r < 0 {
        h[3] += 1
    } else if 0 <= r && r < 1 {
        h[4] += 1
    } else if 1 <= r && r < 2 {
        h[5] += 1
    } else if 2 <= r && r < 3 {
        h[6] += 1
    } else if 3 <= r && r < 4 {
        h[7] += 1
    } else if 4 <= r && r < 5 {
        h[8] += 1
    } else if 5 <= r {
        h[9] += 1
    }
    
}

print("max: \(max)  min: \(min)")

print(h)

for k in 1..<n {
    xhatminus[k] = xhat[k-1]
    Pminus[k] = P[k-1] + Q
    
    K[k] = Pminus[k] / (Pminus[k] + R)
    xhat[k] = xhatminus[k] + K[k] * (z[k] - xhatminus[k])
    P[k] = (1 - K[k]) * Pminus[k]
}

実行結果
Kalman01
途中、rand_normalのばらつき具合をテストしています。rが真値3.0を中心にばらついてることを確認できました。(下部Windowのprint出力)
ばらつきを持ったデータ列zから推定されて、真値3.0に近づいていく様子がグラフで見られます。

]]>
Entropy ../../../20151102464/ Mon, 02 Nov 2015 14:04:56 +0000 ../../../?p=464 エントロピーという熱力学で使われる概念は、いろんな分野で使われることがあります。日本語で煩雑さ、無秩序の度合い、といわれますが、わかっているつもりでもうまく説明できなかったりします。講談社ブルーバックス「エントロピーがわかる」にエントロピーをわかりやすく説明したモデルがあったので、それをSwift/Playgroundで実行してみました。
ent
cmaxが配列の要素数(100)、cntが試行の数(3000)で、初期値ゼロの配列からランダムに選ばれた要素にランダムに0または1を設定します。グラフは配列の合計をプロットします。
試行を重ねると(配列数/2) の数、この例だと50あたりに収束していきます。初期値ゼロは、 何かの一方に偏った(整った)状態を表し、時間とともにだんだんエントロピーが増大していく、混ざって複雑化していく、といったところでしょうか。
Swift/Playgroundってこういうのに便利ですね。

]]>
Linguistic Tager / Swift ../../../20150427304/ Mon, 27 Apr 2015 07:30:01 +0000 ../../../?p=304 言語解析に便利なライブラリが、iOS,OSXにあるのを知って使ってみました。
きっかけは、機械学習の記事を読んでいて、その存在を知りました。

「Swift での自然言語処理」
https://realm.io/jp/news/natural-language-processing-with-swift/

プレゼンの動画もありますが、英語によるとても素晴らしい発表・質疑応答です。
ここではNSLinguisticTaggerに関する、品詞解析、原形取得、言語判定を取り出してみました。
元のプログラムそのままですが、タプルを配列に追加する部分で、typealiasにしないとできないとなっていたところを、(String,String?) -> (String,String!)に変更しました。「let tag: String!」 と定義されていたからです。
nilで、エラーになってしまうかもしれませんが、シンプルに動かすためこのようにしました。
環境 : Swift 1.2 / Playground / Xcode 6.3 / Mac OSX 10.10.3
linguistics01
言語判定の部分は、ある程度長さがないと正確でないようです。
また、言語の混在は日本語と英語はうまくいきました。
これはこれで、私もこれはクールな機能だと思います。

]]>
Swift / Xcode playground ../../../20150412297/ Sun, 12 Apr 2015 06:02:16 +0000 ../../../?p=297 今一番ホットなプログラム言語といえば、Swiftではないでしょうか。iPhone,Macの開発言語として、従来のObjective-Cに変わるものです。
現在Swiftは、iPhoneの開発で使っていますが、先日Swift 1.2 / Xcode 6.3にバージョンアップされたので、テストしてみました。

環境 : Playground / Xcode 6.3 / Mac OSX 10.10.3
Playgourndとは、Swiftをリアルタイムに記述・実行できる開発環境で、結果を数値・グラフで表示できます。データの表示だけでもいろいろと使えそうです。
(従来のObjective-Cにはありませんでした)
swift01

これまでと違うところは、グラフがAssistant Editorの別枠ではなく、Swiftを記述する部分に表示されるようになりました。(Mathematicaとか、DrRacketのような感じになりました) 最新OSのYosemiteが必要なのでバージョンアップしましたが、そのためフラットデザインになっています。
また型チェックが厳しくなり、従来のコードがエラーを出すことがあります。

プログラムは、Swiftの最大の特徴ともいえるOptionalのテストも兼ね、平方根の計算結果のグラフ表示をしました。
一つ目は、通常の方法(マイナスのルートはNaNとなる)、二つ目はマイナスの平方根の場合はnilを返すようにしたものです。 Dobule? というのが通常のDobuleとnilの両方をもつことができる型です。
最後は、Optionalのシンプルな例を記述しました。d:Int? = 3 で、3がラップされており、d!でアンラップされるという特徴がわかります。

参考 : http://qiita.com/koher/items/c6f446bad54442a28bf4

このサイトで詳しく述べられていますが、Union Typeと呼ばれる新しい概念として考えるとOptionalも理解しやすいです。
効果は、コンパイル時にエラーをより多く発見できることでしようか。

このSwift言語、最新の関数型言語の特徴を大きく取り入れたいるにもかかわらず、C言語のポインタも使えるという、時代を大きく跨いでいる仕様になっています。
これは過去の資産をリンクしやすいことを意味します。それだけにMacにとどまらず、他のプラットホームにも展開を期待したいです。

You’re learning Swift anyway.
http://elementscompiler.com/elements/silver/

]]>