スカラー倍算
基本的なところをおさらいしてちゃんと作り直して速くなった.
スカラー倍算
基本的なところをおさらいしてちゃんと作り直して速くなった.
フィックスターズで開催. 基本的なところのサーベイ.
だるい
ここ最近, 体がだるくて全然動けない. やりたいこと, やらないといけないことははいろいろあるのだけど. 朝選挙だけ行った.
『夜間飛行』(サン・テグジュペリ, 二木 麻里訳)
こちらの訳は初めて. うろ覚えのストーリーと大分印象が違った. 読みやすくてよかった.
CCSE2019参加発表
ほとんどAI・機械学習の発表の中, ラボの3人は違うテーマ. まあ, いかにもな感じではある.
暗号化したままクロス集計をするデモ. CCSE用に準備した. 本社のデザイングループの人にデザインをお願いしたのでよい感じ.
東大情報数学セミナー
高島さんによるペアリングを用いた関数型暗号の紹介.
Xeon Platinum 8280x2
Intelの人が送ってくださいました. すごいスペックで大興奮です. 本当にありがとうございます.
とりあえずUbuntu 19.0を入れていろいろセットアップ.
>xbyak/sample/test_util ... avx512f avx512dq avx512cd avx512bw avx512vl avx512_vnni
おおっ.
cuspの場合の群構造
ラボユースで質問されたので久しぶりに計算してみた.
E = {(x, y) | y^2 = x^3, x ≠ 0}とする. φ : E ∋ (x, y) ├→ t = x/y ∈ Fp^* φ^(-1) : Fp^* ∋ t ├→ (t^(-2), t^(-3)) ∈ E P = (x1, y1), Q = (x2, y2), P + Q = (x3, y3), x1/y1 = t1, x2/y2 = t2, x3/y3 = t3とする. λ = (y2 - y1) / (x2 - x1) = (t1^2 + t1t2 + t2^2)/(t1 t2 (t1 + t2)) x3 = λ^2 - (x1 + x2) = ... = (1/(t1 + t2))^2. よってt3 = t1 + t2.
これによりφ(P) + φ(Q) = φ(P + Q)が成り立つので P, Q ∈ Eが与えられたとき, n := φ(Q) / φ(P)を計算するとQ = nPとなってECDLPが解ける.
60分ごとに新しい人とセッションを組んでペアプログラミングをする. 順に, C, C++, Pythonx2, C++, Pythonをやりたいという人たちだった. 初心者の人が多かったので奇をてらうことなく素直なコードになるようにアドバイス.
初対面だし, 言語やバックグラウンドも毎回リセットされるので想像以上に集中力が必要で終わったらどっと疲れが来る. でもなかなか貴重な大変で面白かった.
最後のセッションの人はループなし縛りをやりたいということで, 再帰による実装方法の説明をしていたら時間が足りなくなってしまった(疲れて頭も回らない). すんません.
情報数学セミナー参加
三菱電機の高島さんによる講義. 初心者質問もできるのでとてもありがたい. 難しかったけど, 大分理解できるようになってきた気がする(まだ分かってない).
JavaのSwig
mclをJava対応してほしいという依頼があったので久しぶりにアップデートする. 最初はC APIでやろうかと思ったけどJavaのコード書くのが面倒そうなのでC++で自動生成に任せた. Javaでbyte[] bufを受け取るメソッドをC++側で(const char *buf, size_t bufSize)を持つメソッドに対応させるのはiファイルに
%apply(char *STRING, size_t LENGTH) { (const char *cbuf, size_t bufSize) };
と書くだけでよいようだ. swigがよきにやってくれる. 逆のbyte[]を返すメソッドが難儀した. 与えられたバッファにデータをセットするserialize(char *buf, size_t bufSize)に対応させたいのだけど, どうにもうまくいかなくてstd::string& outに変換することにした.
%typemap(jtype) void serialize "byte[]" %typemap(jstype) void serialize "byte[]" %typemap(jni) void serialize "jbyteArray" %typemap(javaout) void serialize { return $jnicall; } %typemap(in, numinputs=0) std::string& out (std::string buf) "$1=&buf;" %typemap(argout) std::string& out { $result = JCALL1(NewByteArray, jenv, $1->size()); JCALL4(SetByteArrayRegion, jenv, $result, 0, $1->size(), (const jbyte*)$1->c_str());
このコードで期待通りのbyte[] T::serialize()が実現した. しかしSwigはもう触りたくないな.
0b1010
mclでsetStr(str, base = 0)がエラーになることがあるというissue. 調べたらbase = 16進数を指定したときに0bで始まる文字列でエラーになっていた.
base = 0のときは0xや0bがついていたら16 or 2進数, それ以外は10進数としてパース. baseが指定されたときは0xや0bのプレフィクスと一致してなければエラーにしてたんだけど0b1010とう文字は16進数としてvalidなのだった. なんともおマヌケな仕様バグである. 全然気がつかなかったなあ.
Microsoft MVP
OSS開発のおかげで再受賞. どうもありがとうございます.