“Move semantics in rust, C++, and Hylo”を読んだ

Move semantics in rust, C++, and Hylo を読んだ。

  • 筆者のHyloの論文を読んだ所感である
  • Hyloはプログラミング言語である
    • Rustと同様にメモリ安全
  • C++, Rust, Hyloの違いを説明している
    • 関数の引数に構造体を渡したときコピーするか
    • 関数の引数に渡した構造体を以降で使えるか?
  • Rustは受渡と借用というプロパティを呼出ルールに付与
  • Hyloはlet, set, sink, inoutというプロパティを呼出ルールに付与

一度借用の理論的な背景を整理したい。

“Understanding the BM25 full text search algorithm” を読んだ

概要

Understanding the BM25 full text search algorithm | Evan Schwartz を読んだ。

  • 全文検索のアルゴリズムである BM25(Best Match 25) についての記事である。
  • BM25は確率的にランク付けされる
  • BM25の独創的な2つの側面
    • 数式から厳密な確率を計算を省き、かつ順位を保持する
    • クエリが大半の文書と関連しないと仮定する

参考文献

“The Art and Mathematics of Genji-Kō” を読んだ

概要

The Art and Mathematics of Genji-Kō – OranLooney.com を読んだ。

  • 室町時代の香を記録するために使用された源氏香というダイグラムについての記事である
  • Pythonスクリプトでそのダイアグラムの描画を試みている
  • 帰納的に2つのルールを発見し、コストベースの最適化を実装している
  • 上記で実装されたスクリプトでは4つの源氏香がうまく描けない
  • 一般的な数え上げ問題を考えている
  • ベル数との関連に言及している

和書 (小林 2024) を一回さらっと読んだが、もう一度読んでみよう。

参考文献

小林 吹代. 2024. 和算からベルヌーイ数へと続く数の世界 ~ベル数・スターリング数でも和算家はスゴかった~ 知りたい!サイエンス. Kindle版. 技術評論社. https://lead.to/amazon/jp/?op=bt&la=ja&key=B0CZ5QHP87.

中国の剰余定理のアルゴリズム(Algorithm.10.20)

概要

(Gathen and Gerhard 2013) を参考にして、中国の剰余定理のアルゴリズムを実装する。

実装 (Algorithm.10.20)

def alg10_20(cs, i_s, i_e, M, i_r0, j_r0):
    if i_e - i_s == 1:
        return cs[i_s]
    else:
        return M[i_r0][j_r0+1] * alg10_20(cs, i_s, i_s+(i_e-i_s)//2, M, i_r0-1, 2*j_r0) \
             + M[i_r0][j_r0]  *  alg10_20(cs, i_s+(i_e-i_s)//2, i_e, M, i_r0-1, 2*j_r0+2)

ms = [2, 3, 5, 7, 11, 13, 17, 19]
ms, r, k = pack_ms(ms)
M = alg10_3(ms)
cs = list(range(len(ms)))
alg10_20(cs, 0, len(ms), M, -2, 0)
25524916

参考文献

Gathen, Joachim von zur, and Gerhard Jürgen. 2013. Modern computer algebra. 3rd ed. Cambridge: Cambridge University Press.

“The stereographic projection of the Stern–Brocot tree” を読んだ

The stereographic projection of the Stern–Brocot tree を読んだ。

  • Stern-Brocot木とピタゴラストリプルの関連について述べている
  • ピタゴラストリプルの列挙があり、それが円上の有理点に対応する
  • 数学者バーニングによりピタゴラストリプルに階層構造が発見された
  • Barning-Hall木は3分木である
  • これは最初のピラゴラストリプル[3, 4, 5]に3×3行列A,B,Cを左から掛けることで順次得られる
  • Barning-Hall木はピタゴラストリプルの順列をカバーしていない
  • Stern-Brocot木を立体射影したものがそれをできる?

興味深いが後半は理解が覚束無い。記事に内に同一の筆者による記事:Some notes on the Stern–Brocot tree があるので読んでみたい。

“Writes large correct programs”を読んだ

Writes large correct programs を読んだ。

  • コンピュータサイエンティストがプログラムを上手くかけるとは限らない
  • プログラムを上手くかける人とは?
  • 書籍:”Smart and Gets Things Done“を紹介し、「大きくて正しいプログラムを書く人」と答えている
  • ソフトワェアのサイズに応じたコストの見積りはプロのプログラマー以外には難しい
  • 素人はプログラムが正しいと信じる
  • 専門家はバグがあると考え、どのようなテストをしたが、ログ機能があるかを説明する

中国の剰余定理のアルゴリズム(Algorithm.10.18)

概要

(Gathen and Gerhard 2013) を参考にして、中国の剰余定理のアルゴリズムを実装する。

Alg10.18

このアルゴリムズは入力m1,…,mr-1で、法miでのm=m1…mi-1,mi+1,…,mr-1 の逆元を算出するものである。

拡張ユークリッド互除法法を使用するため拡張ユークリッド互除法を参考にした。

実装

実装は以下のようになる。

def alg10_18(ms):
    m = functools.reduce(lambda a, b: a*b, ms, 1)
    ms2 = [mi**2 for mi in ms]

    # 1. call alg10_16 (alg10_16はalg10_3とalg10_14を併せたもの)
    M = alg10_3(ms2)
    m_rem_mi2 = alg10_14x(0, len(ms2), m, M, -2, 0)

    # 2. m/mi rem mi
    m_rem_mi = [m_rem2//mi for mi, m_rem2 in zip(ms, m_rem_mi2)]

    # 3. extended euclidean algo
    si = []
    for mi, mi_rem in zip(ms, m_rem_mi):
        a, b = xgcd(mi, mi_rem)
        if 0 < b:
            si.append(b)
        else:
            si.append(b+mi)
    return si

結果

期待する結果は以下である。

ms = [2, 3, 5, 7, 11, 13, 17, 19]
m = functools.reduce(lambda a, b: a*b, ms, 1)

si = []
for mi in ms:
    for i in range(1, mi):
        if 1 == (i * m//mi) % mi:
            si.append(i)
            break;
si
1 1 2 6 7 5 16 18

実装した結果は以下になり、一致している。

ms = [2, 3, 5, 7, 11, 13, 17, 19]
ms, r, k = pack_ms(ms)

alg10_18(ms)
1 1 2 6 7 5 16 18

参考文献

Gathen, Joachim von zur, and Gerhard Jürgen. 2013. Modern computer algebra. 3rd ed. Cambridge: Cambridge University Press.

“Traits are a Local Maxima”を読んだ

Traits are a Local Maxima · thunderseethe’s devlog を読んだ。

  • プログラミング言語RustのTraitsについての記事である。
  • Traitsは80年代からその概念があり、成熟している。
  • Traitsは型を定義するCrateに存在、またはTraitsを定義するCrateにある必要がある。
    • Rust が特性の実装を特定のクレートに強制的に配置するのは、タイプごとに 1 つの実装のみを許可するためです。
  • Orphan instance – HaskellWiki という問題が生じる。
  • COCHIS という論文がある
  • Local Implicit は孤立インスタンツを解決する?
  • 筆者はTraitが現状の局所最適で、局所暗黙のほうがよいと考えている。