タグ

algorithmに関するyuguiのブックマーク (212)

  • 「ED25519」が爆速な理由とその仕組み

    25519とはなんぞ 大きな素数である p = 2^{255} - 19 から取られている。 この素数のおかげで計算が高速になる。 楕円曲線とはなんぞ y^2 \equiv x^3 + ax + b \pmod{p} p が大きな素数。 y^2 と x^3 + ax + b それぞれ p で割った余りが同じになるような x と y の点を集めたら曲線になった どうやって暗号化してるの? 「点 P と点 Q を結ぶ直線が曲線と交わるもう一つの点の、 x 軸に対する対称点」を点 P と点 Qの加算の結果と定義する 図[1]で簡単に説明すると P と Q の足した結果が R になるような計算を加算と定義するということ。 k を秘密鍵として、ある点 P を k 回加算した結果 点 G と点 P を公開情報とする。 その場合高速に k 回加算する計算をする必要がある。(点 G と点 P から k を

    「ED25519」が爆速な理由とその仕組み
  • NTT、計算機科学の未解決問題を解決 著名教科書の「二分決定グラフ」に関する誤りを指摘

    NTTは2月19日、計算機科学の未解決問題を解決したと発表した。同社が解決したのは、著名なデータ構造として知られる「二分決定グラフ」に関する未解決問題。今回示した理論は、計算機科学の著名な教科書にあった記述の誤りを指摘しており、研究チームの修正案が承諾され、内容が改訂されるという。 二分決定グラフとは、集合のあつまりである「集合族」を表現するデータ構造だ。例えば、集合{1, 2}と集合{2, 3}からなる集合族は、{{1, 2},{2, 3}}と表現できる。集合族は汎用性が高く、さまざまなデータ構造を表現する際に使われる。その例には、ある地点から別の地点までの移動経路の組合せや、同時に利用可能なクーポンの組合せなどがある。 ネットワークの通信パターンを表現する集合族、二分決定グラフの例 図では16個の通信パターンを16個の集合からなる集合族で表現し、それを11個のノード(節点)を結ぶ線から

    NTT、計算機科学の未解決問題を解決 著名教科書の「二分決定グラフ」に関する誤りを指摘
  • 毎秒現在地を使った最近傍探索をしたい - Mobile Factory Tech Blog

    こんにちは。駅メモエンジニアの id:dorapon2000 です。 約半年前の 6 月 1 日にステーションメモリーズ!(駅メモ!)10 周年を記念してタイムラインと地図の切替機能をリリースしました。大変好評を頂いておりとても嬉しいです。 今回は、その機能の中で毎秒最寄り駅を計算するロジックをどのように実現しているのかについてお話します。様々なスペックの端末で遊ばれているため、可能な限りリソースを節約するような工夫をしました。堅い言い方をすれば、過去の計算情報を使った最近傍探索アルゴリズムを実装しました。 記事中のサンプルコードは TypeScript で記述しています。 2024/11/22 追記: はてなブックマークでのご指摘ありがとうございます。 ご指摘をいただいた「事前計算の時間計算量」と「基準点と現在地の距離が近すぎるとき」の説明部分を修正しております。 誤:事前計算を O(N

    毎秒現在地を使った最近傍探索をしたい - Mobile Factory Tech Blog
  • ネット上に氾濫する自己組織化マップ(SOM)の情報を俺が整理する【随時更新】 - Qiita

    【こちらの記事は新しい情報を見つけ次第、更新していきます。また皆さんからの「こんなのもあるよ!」も大歓迎です!】 はじめに 皆さんは自己組織化マップもしくは自己組織化写像(Self-Organizing Maps: SOM)と呼ばれる手法をご存知でしょうか?多変量データの可視化などに使われるアルゴリズムで、現在の機械学習やデータ解析ブームの遥か昔から使われてきました。 しかし、私が思うにSOMは非常に「初見殺し」な手法です。SOMについて学ぼうとする人の多くは、ネット上のあらゆる種類の情報に惑わされ、用途に対してあまり適切な説明がされていないテキストで学んでしまうことも少なくありません。その理由は大きく2つあります。 二つの解釈があり、それぞれで適切な運用方法も異なる SOMには脳機能のモデル化というサイエンス的な側面とデータ解析という工学的な側面があります。元々は前者の発想で考案されたも

    ネット上に氾濫する自己組織化マップ(SOM)の情報を俺が整理する【随時更新】 - Qiita
  • [0.0, 1.0) の乱数を得るための“本当の”方法

    レイトレ合宿9(*)のセミナー発表スライドです。 * https://sites.google.com/view/rtcamp9/home - 2023/09/08 “除算法2”追記。(@Reputelessさんありがとうございました)

    [0.0, 1.0) の乱数を得るための“本当の”方法
  • Pike VMとEarley法の関係についてRubyで実装して考えてみる | makenowjust-labs/blog

    正規表現マッチングの実装手法の1つとしてPike VMと呼ばれるものがあります。 これはGo言語の正規表現実装やRustのregex crateで使われている手法であり、正規表現rrrと入力文字列wwwに対してO(∣r∣×∣w∣)O(|r| \times |w|)O(∣r∣×∣w∣)の計算量でマッチングができるのが特徴です。 Earley法はJay Earleyの提案した文脈自由文法 (CFG) の構文解析手法の1つです。 すべてのCFGを構文解析できる手法で最悪計算量はO(∣w∣3)O({|w|}^3)O(∣w∣3)ですが、無曖昧であればO(∣w∣2)O({|w|}^2)O(∣w∣2)で、決定的であればO(∣w∣)O({|w|})O(∣w∣)で構文解析ができます。 実装してみると分かりますが、Pike VMとEarley法には類似している点があり、Earley法をPike VMの発展系の

    Pike VMとEarley法の関係についてRubyで実装して考えてみる | makenowjust-labs/blog
  • 徐々に高度になるリングバッファの話 - Software Transactional Memo

    リングバッファのイメージ図 1. リングバッファとは何か 機能的にはFirst In First Out (FIFO)とも呼ばれるキューの一種であるが、リング状にバッファを置いてそれの中でReadとWriteのインデックスがグルグルと回る構造をとる事によって容量に上限ができることと引き換えに高速な読み書き速度を得たものである。キューを単に実装するだけなら山ほど方法があって線形リストを使ってもいいしスタックを2つ使っても原理的には可能だ。その中でもリングバッファを用いた方法の利点はひとえに性能の高さでありメモリ確保などを行わないお陰でシステム系の様々な場所で使われている。 これの実装自体は情報系の大学生の演習レベルの難度であるが少し奥が深い。まずリングバッファのスタンダードなインタフェースと実装は以下のようなものである。 class RingBuffer { public: explicit

    徐々に高度になるリングバッファの話 - Software Transactional Memo
  • キャッシュアルゴリズムの比較 - falsandtruのメモ帳

    アプリケーションなどOSより上に作られる高水準のプログラムではハードウェアの速度と容量を考慮しない数学的キャッシュアルゴリズムが使われ主にこれを稿の対象とする。キー探索用マップと明示的キャッシュサイズ(対となる値が保持されているキーのサイズ)は計算量に含まれない。 LRU 最も単純かつ高性能な基礎的キャッシュアルゴリズム。そのため性能比較のベースラインとして常に使用される。逆に言えば実用最低水準の性能である。スキャン耐性皆無でスキャン一発でキャッシュとヒット率がリセットされゼロからやり直しになるため非常に脆く不確実な性能となりベンチマークにおける性能が表面上さほど悪くなく見えても実際の性能はこのような外乱により大きく低下しやすい。このためLRUより高度な主要アルゴリズムはすべて大なり小なりスキャン耐性を備えている。ちなみにプログラミング言語最大のパッケージマネージャであるJavaScri

    キャッシュアルゴリズムの比較 - falsandtruのメモ帳
  • 披露宴の席次を Gromov-Wasserstein 最適輸送で決めた話

    数理最適化 Advent Calendar 2022の9日目です。 新緑の頃、新型コロナ流行の合間をぬって、ささやかな結婚披露宴を表参道の式場にて催しました。諸々の準備の中でも席次はこだわるとキリがなく、数理最適化を使って決めました。人間関係をできるだけ保つようなゲスト集合から座席集合への写像を考えます。 ゲスト間人間関係を考慮して良い感じの配席を考えたい tl;dr 披露宴をしました 知り合い関係が複雑かつ長机でゲストの席配置が難しい 組合せ爆発は物。高々20人の配置に1週間以上悩んだ結果、数理最適化した方が早いと結論 「知り合い同士を近くに配席する」問題は非凸な二次計画になり汎用ソルバでうまく解けない ゲストを席に"輸送"すると考えて最適輸送の一種で解くとうまくいった 質的に非凸な問題を非凸のまま、しかし性質の良い距離構造を活用するアプローチが奏功したのではないか 再現用Colab

    披露宴の席次を Gromov-Wasserstein 最適輸送で決めた話
  • log をつけずに解くのが好きな人向けの記事 - えびちゃんの日記

    \(\Theta(n \polylog(n))\) 時間で解くのは簡単だけど、実際には \(\Theta(n)\) 時間で解けるよーという問題はちょくちょくあります。 競プロ界隈では log を削ることに意欲的な人は一部だけな気がします*1が、話として知っておいても損はあまりない気がするので、挙げてみます。 ここではざっくり紹介するに留め、詳細は各自調べてもらうようなスタンスになっています。 紹介 RMQ 中央値 篩による素数判定 過半数 行最小値 接尾辞配列 最深共通祖先 Decremental neighbor query Level ancestor SWAG Gray code の利用 ±1 配列の転倒数 周期検出 周期検出 2 その他メモ おわり 紹介 RMQ 長さ \(n\) の配列 \(a = (a_0, a_1, \dots, a_{n-1})\) に対して、区間最小値 \

    log をつけずに解くのが好きな人向けの記事 - えびちゃんの日記
  • テキストエディタで使われがちなデータ構造 Piece Table の概要と実装 - A Memorandum

    テキストエディタのデータ構造 Gap method Piece Table method Piece Table の構造 Piece Table の実装 Piece Table のメソッド まとめ テキストエディタのデータ構造 テキストエディタで採用されているデータ構造にはいろいろあります。 こちらの論文 Data Structures for Text Sequences では各種データ構造について比較検討されています。 多くは、Gap method や Piece table method をベースにしたものが多いのではないでしょうか(図で言う最下部の中心の丸印に当たります)。最近では Rope なども有名ですね。 Gap method Gap method では、現在のカーソル位置で、テキストバッファを2つに分割し Gap を間に挟み、カーソル位置に対する編集(テキスト追加/削除)を

    テキストエディタで使われがちなデータ構造 Piece Table の概要と実装 - A Memorandum
  • CRDT (Conflict-free Replicated Data Type)を15分で説明してみる - Qiita

    下記はスライドの講演の書き下しのようになっているので、スライドだけ見るんじゃなくて、スライドを見ながら文章を読み進めたい方向けです。 CRDTとは 今回は、CRDTというデータ構造について紹介します。CRDTはそもそも2011年にSSS(Stabilization, Safety, and Security of Distributed Systems)という国際会議で、INRIA(フランス国立情報学自動制御研究所)のMarc Shapiro博士によって発表された、比較的新しいモノです。 CRDTは"Conflict-free Replicated Data Type"の略で、日語で言うと、__コンフリクトしない複製可能なデータ__といった感じです。 CRDTには実現方法によって2種類の呼び方が存在します(それぞれの略もまたCRDTなのでややこしいですが)。 Commutative Re

    CRDT (Conflict-free Replicated Data Type)を15分で説明してみる - Qiita
  • 共同編集を支える技術とライブラリの活用 - ICS MEDIA

    Google Docs』や『Figma』といったリアルタイムな共同編集ツールの恩恵を受けている人は数多くいるでしょう。『Visual Studio Live Share』のようなエンジニアに嬉しいツールも生まれ、今日ではオンライン上でも円滑なコミュニケーションが可能になっています。 これらのツールの基礎にあるのが「共同編集」のテクノロジーです。記事ではこの技術に焦点を当て、その仕組みと主にフロントエンドでの実用例について紹介します。 記事の前半では、リアルタイムな共同編集に用いられる技術やアルゴリズムについて、発展の歴史とあわせて紹介します。解説用のコードにはJavaScriptおよびTypeScriptを使用しますが、フロントエンドエンジニアに限らず共同編集の仕組みについて気になる読者が知識を深めるきっかけとなるはずです。 さらに後半ではフロントエンドの開発者目線で、前半で紹介した技

    共同編集を支える技術とライブラリの活用 - ICS MEDIA
  • リアルタイム共同編集のアルゴリズム (Operational Transformation; OT) を理解する試み – RORO

    Google Docsのように文書を複数人でリアルタイムに共同編集できるアプリケーションがあります。あのような機能は、多かれ少なかれ、Operational Transformation (OT; 操作変換) という考え方を使って実現されているようです。興味があったので、このOTについて調べてみました。 (追記: これからは OT でなく CRDT だという話 → I was wrong. CRDTs are the future) なおGoogle Docsではいわゆる「リッチテキスト」を共同編集できますが、ここでは話を簡単にするために「プレーンテキスト」を共同編集することを想定します。 リアルタイム共同編集の流れ 共同編集システムの登場人物は次の通りです: サーバ x 1(各クライアントから届く編集操作をもとに、最新の文書を保持します) クライアント x N(文書を編集する側です) そ

  • 中日新聞:自動車工場のガロア体 QRコードはどう動くか

    その誕生を地元新聞も経済新聞も記事にしなかった。2年後、『コードの情報を白黒の点の組み合わせに置き換える』と最下段のベタ記事で初めて紹介された時、その形を思い浮かべることができる読者はいなかった。いま、説明の必要すらない。QRコードはなぜ開発され、どう動くのだろうか。 QRコードは、自動車生産ラインの切実な要請と非自動車部門の技術者の「世界標準の発明をしたい」という野心の微妙な混交の下、1990年代前半の日電装(現デンソー)で開発された。 トヨタグループの生産現場では、部品名と数量の記された物理的なカンバンが発注書、納品書として行き来することで在庫を管理する。そのデータ入力を自動化するバーコード(NDコード)を開発したのがデンソーだ。 バブル全盛の1990年ごろ、空前の生産台数、多様な車種・オプションに応えるため、部品も納入業者も急激に増え、NDコードが限界を迎えていた。63桁の数字しか

  • 最短経路問題としての裁定取引

    チャンスを感じますか? あなたは進取の気性に富んだ個人なので、それを悪用しようとするかもしれません。5人のニンジンから始めて、あなたはボブに近づき、彼が喜んで取引する速度で、5人のニンジンを10個のジャガイモと交換します。 次に、あなたはピーターにジャガイモを持って近づきます。彼があなたに5レタスを交換することを知っています。それからあなたはあなたの5つのレタスでポールに近づきます、そして彼はあなたのレタスと10のニンジンを交換します。 いくつかの賢い取引の後、あなたはニンジンの富を2倍にしました。裁定取引の機会を利用して、5人のニンジンを10人に変えました。 その後、村人たちは、ボブ、ピーター、ポールだけがトレーダーではない、より洗練された市場を開拓するかもしれません。代わりに、この小さな村は、ニンジン/レタス市場、レタス/ジャガイモ市場、およびジャガイモ/ニンジン市場を開発する可能性が

    最短経路問題としての裁定取引
  • Binary search with modern processors

    第16回 StringBeginners での発表資料

    Binary search with modern processors
  • タイムマシン・コンピューター

  • APIに利用制限をかけるとしたらどういうやりかたがあるのか - おもしろwebサービス開発日記

    この記事はSmartHR Advent Calendar 2020 11日目の記事です。 僕のお手伝いしているSmartHRでは、毎週バックエンドエンジニアが集まり、技術的なトピックについて共有、相談しあうミーティングを開催しています。そのミーティングでは僕がTipsなどを共有するコーナーが常設されています*1。 このエントリでは、そのコーナーで共有した内容をひとつ紹介します。 APIに制限をかける方法について APIを外部に提供するとき、一定の制限をかけてユーザがAPIを乱用するのを防ぐことはよくあることではないでしょうか。素直に考えると「1時間に5000回までAPIを実行できる」のようなやり方を思いつきますね。GitHubAPIもそのやり方ですし、SmartHRAPIも同様です。 じゃあそれでいいのでは。となるかもしれませんが少し待ってください。いろんなクライアントがAPIを大量に

    APIに利用制限をかけるとしたらどういうやりかたがあるのか - おもしろwebサービス開発日記
  • 論文|snmalloc: A Message Passing Allocator (ISMM 2019)

    「snmalloc: A Message Passing Allocator」という論文を読んだのでその紹介です。論文は ISMM (International Symposium on Memory Management) 2019 に採択されており、論文とソースコードは GitHub (microsoft/snmalloc) で公開されています。リポジトリ名から分かる通り、著者の多くが Microsoft Research に所属しています。 免責 読み間違えている可能性があります。正確な情報が欲しい方は必ず論文を読んでください。誤りの指摘や補足、議論などは GitHub Issue や Twitter へお願いします。 更新履歴 2019/07/08 bump pointer と free list の next entry pointer を判定する方法について追記 2019/0

    論文|snmalloc: A Message Passing Allocator (ISMM 2019)