楕円曲線暗号を使うためのライブラリと, ペアリング暗号で使うためのライブラリを統合したくてちまちまとやってるのだけどなかなか進まない. 目標は最速ではなくてもいいが, それなりに速くて, パラメータも多少自由度があってx64だけでなくその他のアーキテクチャで動くようにすること.
夏までにはなんとか形になるものにしたい. あとxbyakのAVX512対応も.
楕円曲線暗号を使うためのライブラリと, ペアリング暗号で使うためのライブラリを統合したくてちまちまとやってるのだけどなかなか進まない. 目標は最速ではなくてもいいが, それなりに速くて, パラメータも多少自由度があってx64だけでなくその他のアーキテクチャで動くようにすること.
夏までにはなんとか形になるものにしたい. あとxbyakのAVX512対応も.
『ジョーカー・ゲーム』『ダブル・ジョーカー』(柳広司)
期せずして少し前に読んだ『ライアー』と似た系統. あちらは非公認殺し屋でこちらはスパイ.
「なににもとらわれない」方針はこちらが上かな. あっちは刑事とはいえ部外者にぼろぼろと内実をしゃべっていたし.
天皇に関する軍とD機関の考え方の違いの議論がおもしろかった.
頭痛
めちゃくちゃ酷い. 二日間寝ていた.
問い合わせ2件
CODE BLUE 2015の時に公開したMicrosoft Officeファイルのコマンドラインによる暗号化ツールmsofficeについて.
Excelの拡張子ってxlsxだけかと思ったら, xlsmとかxlsbとかいろいろあるそうな. それらも対応してという依頼. 中身は同じフォーマットらしいのではじいていた部分を修正するだけ.
xbyakをAVX512対応してほしいという依頼. コンシューマで使えるCPUはまだ無いからもう少しあとでいいかと思っていたが, 使ってくれてるのね. ありがたい. フォーマットの調査するか.
3次式の有理化
x = a + bi(i2 = -1)について1 / x = 1 / (a + bi)の分母を有理化するには分子, 分母にa - biをかければよい.
1 / x = (a - bi) / (a2 + b2).
ではx = a + bv + cv2, v3 = t(a, b, c, t ∈ K , vはKの元でない)について1 / xはどうすれば分母を有理化できるか. いくつか方法があるが2次式の応用でやってみる.
x = a + bv + cv2 = (v - α)(v - β)と因数分解する. 解と係数の関係からα + β = -b/c, αβ = a/c.
v3 - α3 = (v - α)(v2 + vα + α2)だからv2 + vα + α2をかければよい. v - βについても同様. したがって
P = (v2 + vα + α2)(v2 + vβ + β2)を計算する. v3 = tなので
P = v4 + (α + β)v3 + (α2 + αβ + β2)v2 + (αβ2 + α2β)v + α2β2
=((α + β)2 - αβ)v2 + (αβ(α + β) + t)v + (αβ)2 + (α + β)t
よって
Pc2 = (b2 - ac2)v2 + (-ab + tc2)v + a2 - bct.
Q = (v3 - α3)(v3 - β3) = t2 - ((α + β)3 - 3αβ(α + β))t + (αβ)3.
よって Qc3 = c3 t2 - (-b3 + 3abc)t + a3.
1 / x = 1 / c(v - α)(v - β) = Pc2 / Qc3.
『ライアー』(大沢在昌)
極秘の殺し屋組織の話. おもしろかった. 後半の戦いの描写は引き込まれた. よく調べたな. ラストの真相解明の部分はもう少しシンプルにした方が, 人の名前がたくさん出てくるとわからなくなる私にはよかったかな. ちょっと分厚い.
ばりばりの研究者による講演. 質問もたくさんできてとてもぜいたく. ありがとうございました.
正田亜八香さんの観測装置の誤差をどうやって減らすかというお話. 不要な区間は制度が悪くなってもいいから, 狙った場所の誤差を減らす方法がおもしろかった. 4kmの長さを使っても原子より小さい長さしかずれないらしい. よくそんなのを検出できるなあ.
「ブラックホールがぶつかって見つかった」の意味が多少なりとも理解できた.
久徳浩太郎さんの相対論的力学, 電磁気学などのサーベイをしつつ一般相対性理論のはなしまで. とても早くてついていくのが大変だったけど約20年に勉強したことでも意外と覚えてるものだ.
ポイントを抑えた講義はすばらしかった. 時間の関係でスキップした部分も聞きたかったなあ.
『昭和元禄落語心中』(アニメ)
最後までみた. よかった. みよきちのせつなさ, 助六と菊比古が期せずして小夏に見せた野ざらし, 最後の二人会での芝浜. すばらしい.
この分野は記号が本によって結構違うからすりあわせが大変やね.
『シュッツ相対論入門』(Bernard Scheutz著 江里口良治, 二間瀬敏史訳)
週末の勉強会に向けて久しぶりに最初の方を読み返す. みなでああだ, こうだ言いながら読んだなあ. 懐かしい.
makeの.SECONDARY
たとえば次のMakefileを作っておいて
>cat Makefile %.o: %.c touch $@ %.exe: %.o touch $@
a.cというファイルがあったときに
make a.exe
とするとa.cからa.oが作られてそれからa.exeができる.
しかしディレクトリを見ると何故かa.oが無い. それで状況をよく見ると
>make a.exe touch a.o touch a.exe rm a.o
だれかがa.oを削除してる! でもMakefileにrmなんて書いてない.
実はmakefileは暗黙の依存関係があるとき, 最初に無かった中間ファイルは削除するものなのらしい(暗黙ルールの連鎖). 全然知らなかった.
第二にmakeが他の何かを更新するためにbを作成する場合に, bが必要でなくなり次第削除されるという点が違います. そのため, make実行前に存在していなかった中間ファイルはmake実行後も存在しない事になります. どのファイルを削除したか, というのはmakeが`rm -f'コマンドを出力して報告してくれます.
だから(もっと複雑な状況で)dependファイルとか正しく書いてるのにたまにbuildし直しになることがあったのか.
そういうのを防ぎたいときはSECONDARYというのを使ってMakefileに
.SECONDARY a.o
を追加すればよい.
『だれもが知ってる小さな国』(有川浩)
発売されてすぐ購入していたけど, 冒頭を読み始めたところで勿体なくて止めていた. けど, せっかくの旅行なので読んでみた.
主人公の特殊な環境の選び方, コロボックルの登場のしかたなど実にうまい.
ただ問題解決にはもっと主人公が主体的に関わってほしかったな. 無い物ねだりというものかもしれないけど.
金沢旅行2日目
朝4時半に目が覚めたのでもう一度付近をランニング. 想像以上に暖かくて気持ちよい.
9年振りぐらいで大学のときの友達に会うため, 午後からは会社の人たちと別行動.
しかし自分が泊まるホテルがなんだったか忘れるというおおぼけをしてしまった. 仕方がないので友達に「今日, 私が泊まるホテルってなんだっけ」というメール.
幸い事前に友達に泊まるホテル名を知らせていたので助かった.
金沢旅行1日目
会社の方たちと金沢へ. 金沢は4回目かな. 初回は大学の友達と来た. 運悪く台風直撃で兼六園は10分ほどしか見られなかった. あと2回は学会関係だったのでほとんど何も見ていない.
今回は念願の金沢美術館. 天気がよくて気持ちよい. 夜は能登半島のほうまで行って泊まる. 料理がおいしかった. 食べすぎて少しランニング.
ライブラリコンパイル時とヘッダ利用時のマクロの不一致をチェックする
7日のミスは次のようなコードにしていたせいだった.
------------- >cat a.h #include <stdio.h> inline bool definedA() { #ifdef A return true; #else return false; #endif } #ifdef A #define STR "defined" #else #define STR "not defined" #endif void init(); ------------- >cat a.cpp #include "a.h" void init() { const bool b = #ifdef A true; #else false; #endif printf("init: A is %s %s\n", STR, (b == definedA()) ? "ok" : "ng"); } ------------- >cat b.cpp #include "a.h" int main() { printf("main: A is %s\n", STR); init(); } -------------
>cl -c a.cpp -DA >cl b.cpp a.obj >b.exe main: A is not defined init: A is defined ok
definedA()はマクロAが定義されていたときのみtrueを返す関数. init()の中でinit()がbuildされたときのbool bとdefinedA()を比較して b.cppとa.cppでAが定義されている/いないが異なっていることをチェックしたつもりだった.
が, init.cppがbuildされたときにtrueは決まってしまうので意味がなかったという初歩的なミス.
init()がbool bを受け取るようにしてdefinedA()を渡すべきだった.
初歩的なのだけど実際にはまるとなかなか気がつきにくい. デバッガで追いかけても突然変数が変わったように見えてしまうこともある.
こういうパターンはわりとある気がする. 大昔, 知り合いがはまっていたのは10進数計算を行うdecNumberというライブラリ.
decNumber.hではDECNUMDIGITSというマクロが定義されてなければ自動的に1になる. ライブラリを作ってから使うときにDECNUMDIGITSに別の値を設定して動かして死んでいた.
もちろんドキュメントには書いてあるのだができるならこういうケースは自衛処理は入れたいな(自戒).
Re: Re: バグ追跡
>さあて, 原因は何かな(楽しみw).
ものすごくくだらない理由だった. 単にコンパイルオプションに必要なマクロがついていないだけだった.
私やlibsnarkの作者はそのマクロが必要なのを知ってつけていたのだけど, libsnarkを使うアプリにも必要なのを忘れていた(というか知らなかった).
オプションの値を表示させてようやく気がついた. libsnarkがライブラリをラップしているのでate-pairingのヘッダが直接ユーザライブラリまで見えているとは思わなかった.
こんなに単純な理由ではまったのは久しぶりだ. 思わせぶりな食い違いが多すぎた.
これはライブラリビルド時につけたオプションとライブラリ使用時のオプションが異なるときに検出する機構を入れておくべきだったな. libsnarkの作者に言われて追加したものなのでおざなりになっていた.
→ 自分のコードを見たら食い違っているとエラーになる機構は埋め込んでした(忘れてた).
→→ でもその機構はうまく働いていなかったようだ(駄目駄目).
Re: バグ追跡
まだ続くけど大分状況を絞り込めた. 発端は私のライブラリ(ate-pairing)を使うライブラリ(libsnark)を使うアプリ(zcash)で発生していた不具合. 私のライブラリを使わないとバグが出ないのでate-pairingに何か起因する問題.
ate-pairingと, 正しく動く(と思われる)代替物のalt-bn128とを切り替えながら調べるのだけど途中の演算が複雑でかなりやっかいだった.
一番困るのが途中の計算方法が違うので値が違ってるのかあってるのか最後の方にならないと分からない点.
覚え書きメモ:
結局, 現状ate-pairingを直接使うとうまくいくけどlibsnarkから間接的に呼ぶとおかしくなることが判明(issues). さあて, 原因は何かな(楽しみw).
ところでZcashって何だろう. 暗号学的に匿名性を保証するBitcoinの派生通貨?
gtagsで細かい設定
share/gtags/gtags.confをコピペして編集して使う(コマンドラインで直接指定する方法は分からなかった).
たとえば除外したいディレクトリは
common:\ :skip=HTML/,HTML.pub/,...
に追加. C++でtemplateの実装を.tccに書いていたりしてそれを参照したいときはbuiltin-parserやlangmap=C++に.tccを追加すればうまくいった.
>gtags . --gtagsconf mygtags.conf
バグ追跡
まだ見つからない. どこから計算がおかしくなってるのか追跡するのが大変. とりあえず自分のとlibsnarkの両方をいじって出力フォーマットを揃える. 乱数処理部分をいじって固定にする.
私のライブラリを使ってるlibsnarkを使ったプロジェクトからの報告. 数日前から調べてるけどどこが悪いのかなかなか見つけられない.
先月末にあったもの. みなさんすごいな.