Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
Cryolite
366 views
A Fast and Space-Efficient Algorithm for Calculating Deficient Numbers (a.k.a. Shanten Numbers).pdf
高速かつ省スペースな向聴数計算アルゴリズム 実装: https://github.com/Cryolite/nyanten
Engineering
◦
Read more
0
Save
Share
Embed
Embed presentation
Download
Download to read offline
1
/ 26
2
/ 26
3
/ 26
4
/ 26
5
/ 26
6
/ 26
7
/ 26
8
/ 26
9
/ 26
10
/ 26
11
/ 26
12
/ 26
13
/ 26
14
/ 26
15
/ 26
16
/ 26
17
/ 26
18
/ 26
19
/ 26
20
/ 26
21
/ 26
Most read
22
/ 26
Most read
23
/ 26
24
/ 26
25
/ 26
26
/ 26
Most read
More Related Content
PDF
PHPからgoへの移行で分かったこと
by
gree_tech
PPTX
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
by
DeNA
PDF
社会シミュレーションとデジタルゲーム
by
Youichiro Miyake
PDF
深層強化学習入門 2020年度Deep Learning基礎講座「強化学習」
by
Tatsuya Matsushima
PDF
複数話者WaveNetボコーダに関する調査
by
Tomoki Hayashi
PPTX
Arxan導入前後で変わったこと
by
Yusuke Shirakawa
PDF
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
PDF
ロジスティック回帰の考え方・使い方 - TokyoR #33
by
horihorio
PHPからgoへの移行で分かったこと
by
gree_tech
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
by
DeNA
社会シミュレーションとデジタルゲーム
by
Youichiro Miyake
深層強化学習入門 2020年度Deep Learning基礎講座「強化学習」
by
Tatsuya Matsushima
複数話者WaveNetボコーダに関する調査
by
Tomoki Hayashi
Arxan導入前後で変わったこと
by
Yusuke Shirakawa
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
ロジスティック回帰の考え方・使い方 - TokyoR #33
by
horihorio
What's hot
PDF
Cognito、Azure ADと仲良くしてみた
by
Takafumi Kondo
PPTX
DeNAの最新のマスタデータ管理システム Oyakata の全容
by
sairoutine
PDF
レコメンドアルゴリズムの基本と周辺知識と実装方法
by
Takeshi Mikami
PDF
オセロゲームにおける強化学習を用いたゲーム戦略の獲得
by
Ko Shira
PPTX
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可
by
Hitachi, Ltd. OSS Solution Center.
PPTX
Mastering Atari, Go, Chess and Shogi by Planning with a Learned Model (MuZero)
by
harmonylab
PDF
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
by
Takateru Yamagishi
PDF
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
by
gree_tech
PDF
線形代数の視覚的理解のためのノート
by
Kenji Hiranabe
KEY
ノンデザイナーのための配色理論
by
tsukasa obara
PPTX
RPGにおけるイベント駆動型の設計と実装
by
Koji Morikawa
PDF
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
by
narumikanno0918
PDF
何となく勉強した気分になれるパーサ入門
by
masayoshi takahashi
PDF
DeepLearning 輪読会 第1章 はじめに
by
Deep Learning JP
PDF
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
by
Yoshie Kaneno
PDF
【Unity道場】物理シミュレーション完全マスター
by
Unity Technologies Japan K.K.
PPTX
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
by
Tokoroten Nakayama
PDF
ゲームの仕様書を書こうまとめ
by
Sugimoto Chizuru
PDF
パネルディスカッション:WebXRメタバースの挑戦 in CEDEC2022 ~Mozilla Hubs活用事例と課題共有~
by
GREE VR Studio Lab
PDF
C#でOpenCL with OpenTK + Cloo
by
aokomoriuta
Cognito、Azure ADと仲良くしてみた
by
Takafumi Kondo
DeNAの最新のマスタデータ管理システム Oyakata の全容
by
sairoutine
レコメンドアルゴリズムの基本と周辺知識と実装方法
by
Takeshi Mikami
オセロゲームにおける強化学習を用いたゲーム戦略の獲得
by
Ko Shira
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可
by
Hitachi, Ltd. OSS Solution Center.
Mastering Atari, Go, Chess and Shogi by Planning with a Learned Model (MuZero)
by
harmonylab
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
by
Takateru Yamagishi
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
by
gree_tech
線形代数の視覚的理解のためのノート
by
Kenji Hiranabe
ノンデザイナーのための配色理論
by
tsukasa obara
RPGにおけるイベント駆動型の設計と実装
by
Koji Morikawa
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
by
narumikanno0918
何となく勉強した気分になれるパーサ入門
by
masayoshi takahashi
DeepLearning 輪読会 第1章 はじめに
by
Deep Learning JP
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
by
Yoshie Kaneno
【Unity道場】物理シミュレーション完全マスター
by
Unity Technologies Japan K.K.
チャットコミュニケーションの問題と心理的安全性の課題 #EOF2019
by
Tokoroten Nakayama
ゲームの仕様書を書こうまとめ
by
Sugimoto Chizuru
パネルディスカッション:WebXRメタバースの挑戦 in CEDEC2022 ~Mozilla Hubs活用事例と課題共有~
by
GREE VR Studio Lab
C#でOpenCL with OpenTK + Cloo
by
aokomoriuta
Similar to A Fast and Space-Efficient Algorithm for Calculating Deficient Numbers (a.k.a. Shanten Numbers).pdf
PPTX
A Fast and Space-Efficient Algorithm for Calculating Deficient Numbers (a.k.a...
by
Cryolite
PPT
4 Info Theory
by
melvincabatuan
ODP
Mazekoze2
by
ume doblock
PDF
データ圧縮
by
Joe Suzuki
PDF
すごいHaskell読書会 第六章 発表資料
by
Hiromasa Ohashi
PDF
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
by
Yuto Takei
PPT
5 Info Theory
by
melvincabatuan
PDF
圏論のモナドとHaskellのモナド
by
Yoshihiro Mizoguchi
PDF
初めてのHaskell (表)
by
karky7
KEY
Algebraic DP: 動的計画法を書きやすく
by
Hiromi Ishii
PDF
Prml 10 1
by
正志 坪坂
PDF
暗号技術の実装と数学
by
MITSUNARI Shigeo
PDF
CODE FESTIVAL 2015 予選B 解説
by
AtCoder Inc.
PDF
Shunsuke Horii
by
Suurist
PDF
楕円曲線と暗号
by
MITSUNARI Shigeo
PPT
3 Info Theory
by
melvincabatuan
PDF
2013computer s1
by
munich1502
PDF
Introduction to Categorical Programming
by
Masahiro Sakai
PDF
公開鍵暗号2: NP困難性
by
Joe Suzuki
PDF
代数的実数とCADの実装紹介
by
Masahiro Sakai
A Fast and Space-Efficient Algorithm for Calculating Deficient Numbers (a.k.a...
by
Cryolite
4 Info Theory
by
melvincabatuan
Mazekoze2
by
ume doblock
データ圧縮
by
Joe Suzuki
すごいHaskell読書会 第六章 発表資料
by
Hiromasa Ohashi
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
by
Yuto Takei
5 Info Theory
by
melvincabatuan
圏論のモナドとHaskellのモナド
by
Yoshihiro Mizoguchi
初めてのHaskell (表)
by
karky7
Algebraic DP: 動的計画法を書きやすく
by
Hiromi Ishii
Prml 10 1
by
正志 坪坂
暗号技術の実装と数学
by
MITSUNARI Shigeo
CODE FESTIVAL 2015 予選B 解説
by
AtCoder Inc.
Shunsuke Horii
by
Suurist
楕円曲線と暗号
by
MITSUNARI Shigeo
3 Info Theory
by
melvincabatuan
2013computer s1
by
munich1502
Introduction to Categorical Programming
by
Masahiro Sakai
公開鍵暗号2: NP困難性
by
Joe Suzuki
代数的実数とCADの実装紹介
by
Masahiro Sakai
More from Cryolite
PPTX
左と右の話
by
Cryolite
PPTX
Lambda in template_final
by
Cryolite
PDF
Allocators@C++11
by
Cryolite
PDF
家に帰るまでが遠足です
by
Cryolite
PDF
Destructive Call
by
Cryolite
PPTX
Boost.PropertyMap (.pptx)
by
Cryolite
PDF
Boost.PropertyMap (.pdf)
by
Cryolite
PPT
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
by
Cryolite
PPT
shared_ptr & weak_ptr (ppt 初版, DL 専用)
by
Cryolite
左と右の話
by
Cryolite
Lambda in template_final
by
Cryolite
Allocators@C++11
by
Cryolite
家に帰るまでが遠足です
by
Cryolite
Destructive Call
by
Cryolite
Boost.PropertyMap (.pptx)
by
Cryolite
Boost.PropertyMap (.pdf)
by
Cryolite
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
by
Cryolite
shared_ptr & weak_ptr (ppt 初版, DL 専用)
by
Cryolite
A Fast and Space-Efficient Algorithm for Calculating Deficient Numbers (a.k.a. Shanten Numbers).pdf
1.
高速かつ省スペースな 向聴数計算アルゴリズム Cryolite 2024/06/15 麻雀アルゴリズム勉強会
2.
ハイライト 0 10 20 30 40 50 60 向聴数計算1回当たりの計算時間 (ナノ秒) tomo氏の実装 本発表の実装 0 5 10 15 20 25 30 35 40 45 データサイズ(MiB) tomo氏の実装
本発表の実装 6倍の高速化 1/12以下のデータサイズ
3.
向聴数と置換数 • ある手牌(自摸直後の場合は14枚,11枚,8枚,5枚,2枚のい ずれか,それ以外の場合は13枚,10枚,7枚,4枚,1枚のいず れか)の向聴数とは,その手牌を聴牌形へと変形するために必 要な自摸の最小回数 • ある手牌の置換数(※)とは,その手牌を和了形へと変形する ために必要な自摸の最小回数 •
向聴数 = 置換数 − 1 • 本発表ではもっぱら置換数について議論する ※https://qiita.com/tomohxx/items/75b5f771285e1334c0a5
4.
和了形と置換数 • 和了形は標準和了形(4面子1雀頭形),七対子和了形,国士無 双和了形に大別される • 七対子和了形および国士無双和了形に対する置換数の計算は比 較的容易なので本発表では省略 •
本発表ではもっぱら標準和了形に対する置換数について議論す る
5.
Q. そもそも向聴数(置換数)計算は高速化しなく ても愚直なアルゴリズムで十分速いのでは? • 麻雀シミュレータ,麻雀
AI 等の実装において向聴数の計算は 頻繁に行われる • 自摸直後に和了を宣言できるかどうかの判定に必要な場合がある • 打牌時にリーチを宣言できるかどうかの判定に必要 • 他家の打牌直後に和了を宣言できるかどうかの判定に必要な場合があ る • 荒牌平局時に聴牌・不聴を判定するために必要 • その他,麻雀 AI の特徴量として必要な場合もある • したがって,向聴数(置換数)の高速化は麻雀シミュレータ, 麻雀 AI 等の高速化に直結する • ∴向聴数(置換数)の高速化は必要
6.
標準和了形に対する置換数計算の既存の アルゴリズム • あら氏のアルゴリズム • https://mahjong.ara.black/etc/shanten/index.htm •
向聴数 = 8 − 面子の数 ∗ 2 − (面子候補の数) という計算において必 要な要素を各色(萬子,筒子,索子,字牌)毎に事前計算しテーブル として保持 • tomo氏のアルゴリズム • https://qiita.com/tomohxx/items/75b5f771285e1334c0a5 • https://github.com/tomohxx/shanten-number • (cf. https://qiita.com/KamichanR/items/de08c48f92834c0d1f74) • 部分的な置換数を各色毎に事前計算しテーブルとして保持 各色毎の事前計算によるテーブル化がキーポイント
7.
tomo氏のアルゴリズム 手牌の萬子部分に関して 手牌の筒子部分に関して 手牌の索子部分に関して
手牌の字牌部分に関して 0面子0雀頭に対する置換数 1面子0雀頭に対する置換数 2面子0雀頭に対する置換数 3面子0雀頭に対する置換数 4面子0雀頭に対する置換数 0面子1雀頭に対する置換数 1面子1雀頭に対する置換数 2面子1雀頭に対する置換数 3面子1雀頭に対する置換数 4面子1雀頭に対する置換数 0面子0雀頭に対する置換数 1面子0雀頭に対する置換数 2面子0雀頭に対する置換数 3面子0雀頭に対する置換数 4面子0雀頭に対する置換数 0面子1雀頭に対する置換数 1面子1雀頭に対する置換数 2面子1雀頭に対する置換数 3面子1雀頭に対する置換数 4面子1雀頭に対する置換数 0面子0雀頭に対する置換数 1面子0雀頭に対する置換数 2面子0雀頭に対する置換数 3面子0雀頭に対する置換数 4面子0雀頭に対する置換数 0面子1雀頭に対する置換数 1面子1雀頭に対する置換数 2面子1雀頭に対する置換数 3面子1雀頭に対する置換数 4面子1雀頭に対する置換数 0面子0雀頭に対する置換数 1面子0雀頭に対する置換数 2面子0雀頭に対する置換数 3面子0雀頭に対する置換数 4面子0雀頭に対する置換数 0面子1雀頭に対する置換数 1面子1雀頭に対する置換数 2面子1雀頭に対する置換数 3面子1雀頭に対する置換数 4面子1雀頭に対する置換数 • 各色に関する部分的な置換数を事前にテーブル化 • 上記の空間において最小置換数を動的計画法で探索
8.
部分置換数のテーブル • 萬子,筒子,索子に関してはまったく同じテーブルとなるため, 数牌のテーブルと字牌のテーブルの2種類のみを持てばよい • 0から4までの数字が9個(数牌の場合)または7個(字牌の場 合)並んだもので数字の合計が14を超えないものをキーとする テーブルとなる •
数牌に対するテーブルのキーの場合の数は405350通り • 字牌に対するテーブルのキーの場合の数は43130通り • 以下,数牌の場合のみを考える(字牌の場合も同様)
9.
部分置換数のテーブル •テーブルのキー: 各色の各牌の数を並べた文字列 例: 🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇🀇
= “320102401” 0から4までの数字が9個並んだ文字列で数字の合 計が14を超えないもの •テーブルの値: 𝑚𝑚面子ℎ雀頭(0 ≤ 𝑚𝑚 ≤ 4, 0 ≤ ℎ ≤ 1)に対する部分置換数(0から9までの数字を10 個並べたもの) 例: 0, 0, 0, 1, 2, 0, 0, 0, 1, 2 1エントリ当たりの値の情報量はlog21010 ≈ 33.2 ビットで64ビット整数に詰め込める
10.
部分置換数のテーブル 配列 vs. ハッシュテーブル •
要素数 59 = 1953125 の配列をテーブルとする方式 • ある色の牌の合計枚数が14を超えないという制約を無視 • tomo氏の実装 • テーブルの参照速度は高速 • 実際には使われない(合計枚数が14を超えるもの)にも要素を割り当 てるため無駄が多い • 最低でも59 × 8 バイト = 15625000 バイト必要 • ハッシュテーブルを用いる方式 • テーブルの参照速度は配列に劣る • (ハッシュが衝突する場合)必要な情報量の下限は405350 × log2405350 ビット + 405350 × 8 バイト ≈ 10790000 バイト 配列の高速性とハッシュテーブルのコンパクトさを両立できないか?
11.
本発表のアイデア • テーブルのキー(0から4までの数字が9個並んだ文字列で数字 の合計が14を超えないもの)に辞書順で番号を付与 =
テーブル のキーに対する最小完全ハッシュ関数を実装 • “000000000” ⇒ 0番目 • “000000001” ⇒ 1番目 • “000000002” ⇒ 2番目 • “000000003” ⇒ 3番目 • “000000004” ⇒ 4番目 • …… • “444110000” ⇒ 435348番目 • “444200000” ⇒ 435349番目 • これが実装できればテーブルの実装サイズを劇的に減らせる
12.
本発表のアイデアの難しいところ • 数字の合計が14を超えないという制約を無視する場合は簡単 • 例えば
”320102401” は何番目か?= 5進数による自然数の表現 (3201024015 = 133160110)だと思えばよい • 数字の合計が14を超えないという制約を考慮しつつ,辞書順で 何番目か(ハッシュ)を高速に計算するのが難しい • 例えば “320102401” は辞書順で何番目?????
13.
例: “320102401” は数字の合計が14を超え ない集合において辞書順で何番目か? •
Q. “3” というプレフィックスを持つキーは何番目以降になるか? • A. (“0” というプレフィックスを持つキーの総数) + (“1” というプレフィッ クスを持つキーの総数) + (“2” というプレフィックスを持つキーの総数) 以降 • Q. “32” というプレフィックスを持つキーは何番目以降になるか? • A. (“3” というプレフィックスを持つキーの総数) + (“30”というプレ フィックスを持つキーの総数) + (“31”というプレフィックスを持つキーの 総数) 以降 • …… • Q. “320102401” というプレフィックスを持つキーは何番目以降になるか, つまり “320102401” は何番目か? • A. 計算はできる!
14.
定義: 数牌語と数牌言語 字母系を Ω
= 0,1,2,3,4 とする.字母系を9個並べた語であって それらの合計が14を超えないものを数牌語と呼ぶことにする. また,数牌語全体からなる集合(言語)を数牌言語と呼び 𝐷𝐷数牌 で表す.
15.
列挙関数と列挙符号 • 定義(列挙関数) Ω を字母系とする語からなる有限集合を
𝐷𝐷 とする.このとき, ある 𝑣𝑣 ∈ Ω∗ に関して 𝑢𝑢𝑢𝑢 ∈ 𝐷𝐷 となるような 𝑢𝑢 ∈ Ω∗ に対して 𝐷𝐷 に関する列挙関数を 𝐸𝐸𝐷𝐷 𝑢𝑢 = 𝑢𝑢𝑢𝑢|𝑢𝑢𝑢𝑢 ∈ 𝐷𝐷 と定義する. • 定理(列挙符号) 全順序を備える字母系 Ω の語からなる有限集合を 𝐷𝐷 とする(𝐷𝐷 には自然な辞書順が定義される).このとき 𝑤𝑤 = 𝑐𝑐0𝑐𝑐1 … 𝑐𝑐𝑙𝑙−1 ∈ 𝐷𝐷 (𝑐𝑐𝑖𝑖 ∈ Ω) に対して 𝐷𝐷 の列挙符号を 𝐻𝐻𝐷𝐷 𝑤𝑤 = ∑𝑐𝑐′<𝑐𝑐0 𝐸𝐸𝐷𝐷 𝑐𝑐′ + ∑𝑐𝑐′<𝑐𝑐1 𝐸𝐸𝐷𝐷 𝑐𝑐0𝑐𝑐′ + ⋯ + ∑𝑐𝑐′<𝑐𝑐𝑙𝑙−1 𝐸𝐸𝐷𝐷 𝑐𝑐0 … 𝑐𝑐𝑙𝑙−2𝑐𝑐′ と定義すると 𝐻𝐻𝐷𝐷 は 𝐷𝐷 に対する最小完全ハッシュ関数となる.
16.
列挙関数と列挙符号 • 定義(列挙関数) Ω を字母系とする語からなる有限集合を
𝐷𝐷 とする.このとき, ある 𝑣𝑣 ∈ Ω∗ に関して 𝑢𝑢𝑢𝑢 ∈ 𝐷𝐷 となるような 𝑢𝑢 ∈ Ω∗ に対して 𝐷𝐷 に関する列挙関数を 𝐸𝐸𝐷𝐷 𝑢𝑢 = 𝑢𝑢𝑢𝑢|𝑢𝑢𝑢𝑢 ∈ 𝐷𝐷 と定義する. • 定理(列挙符号) 全順序を備える字母系 Ω の語からなる有限集合を 𝐷𝐷 とする(𝐷𝐷 には自然な辞書順が定義される).このとき 𝑤𝑤 = 𝑐𝑐0𝑐𝑐1 … 𝑐𝑐𝑙𝑙−1 ∈ 𝐷𝐷 (𝑐𝑐𝑖𝑖 ∈ Ω) に対して 𝐷𝐷 の列挙符号を 𝐻𝐻𝐷𝐷 𝑤𝑤 = ∑𝑐𝑐′<𝑐𝑐0 𝐸𝐸𝐷𝐷 𝑐𝑐′ + ∑𝑐𝑐′<𝑐𝑐1 𝐸𝐸𝐷𝐷 𝑐𝑐0𝑐𝑐′ + ⋯ + ∑𝑐𝑐′<𝑐𝑐𝑙𝑙−1 𝐸𝐸𝐷𝐷 𝑐𝑐0 … 𝑐𝑐𝑙𝑙−2𝑐𝑐′ と定義すると 𝐻𝐻𝐷𝐷 は 𝐷𝐷 に対する最小完全ハッシュ関数となる. 𝑢𝑢 をプレフィックスとする 𝐷𝐷 の語の総数 𝐷𝐷 における 𝑤𝑤 の辞書順での番号
17.
数牌言語に対する最小完全ハッシュ関数 数牌言語 𝐷𝐷数牌 の語
𝑤𝑤 = 𝑐𝑐0𝑐𝑐1 … 𝑐𝑐8 に対する列挙符号 𝐻𝐻𝐷𝐷 数牌 𝑤𝑤 = � 𝑐𝑐′<𝑐𝑐0 𝐸𝐸𝐷𝐷 数牌 𝑐𝑐′ + ⋯ + � 𝑐𝑐′<𝑐𝑐8 𝐸𝐸𝐷𝐷 数牌 𝑐𝑐0𝑐𝑐1 … 𝑐𝑐7𝑐𝑐′ は最小完全ハッシュ関数(𝑤𝑤 の𝐷𝐷数牌における辞書順での番号). 𝐻𝐻𝐷𝐷 数牌 000000000 = 0 𝐻𝐻𝐷𝐷 数牌 000000001 = 1 … 𝐻𝐻𝐷𝐷 数牌 444110000 = 435348 𝐻𝐻𝐷𝐷 数牌 444200000 = 435349 任意の数牌語 𝑤𝑤 が与えられたときに 𝐻𝐻𝐷𝐷 数牌 𝑤𝑤 を高速に計算できれば良い.
18.
数牌言語のプレフィックスに関する性質 Q. プレフィックス “3201”
につなげて数牌語となるサフィックス の特徴は? A. プレフィックス “3201” は長さが4,数字の合計が6なので,長 さが5,数字の合計が8を超えないサフィックス全て Q. プレフィックス “1041” につなげて数牌語となるサフィックス の特徴は? A. プレフィックス “1041” は長さが4,数字の合計が6なので,長 さが5,数字の合計が8を超えないサフィックス全て あるプレフィックスにつなげて数牌語となるサフィックスの集合は, そのプレフィックスの長さと数字の合計のみから定まる.
19.
数牌言語のプレフィックス定理 • 定義(数牌語のプレフィックス状態) ある 𝑣𝑣
∈ Ω∗ に関して 𝑢𝑢𝑢𝑢 ∈ 𝐷𝐷数牌 となるような 𝑢𝑢 ∈ Ω∗ に対し て,そのプレフィックス状態 𝜎𝜎 を以下で再帰的に定義する: • 𝜎𝜎 𝜀𝜀 = 0,0 • 𝜎𝜎 𝑢𝑢 = (𝑖𝑖, 𝑛𝑛) とするとき, ある 𝑣𝑣 ∈ Ω∗ に関して 𝑢𝑢𝑢𝑢𝑢𝑢 ∈ 𝐷𝐷数牌 となる 𝑐𝑐 ∈ Ω に対して 𝜎𝜎 𝑢𝑢𝑢𝑢 = (𝑖𝑖 + 1, 𝑛𝑛 + 𝑐𝑐) • 定理(数牌言語のプレフィックス定理) ある𝑣𝑣 ∈ Ω∗ , 𝑣𝑣′ ∈ Ω∗ に関して 𝑢𝑢𝑢𝑢 ∈ 𝐷𝐷数牌, 𝑢𝑢′ 𝑣𝑣′ ∈ 𝐷𝐷数牌 となるよ うな 𝑢𝑢 ∈ Ω∗ , 𝑢𝑢′ ∈ Ω∗ に対して, 𝜎𝜎 𝑢𝑢 = 𝜎𝜎 𝑢𝑢𝑢 ならば 𝐸𝐸𝐷𝐷 数牌 𝑢𝑢 = 𝐸𝐸𝐷𝐷 数牌 𝑢𝑢𝑢 である.
20.
数牌言語のプレフィックス定理 • 定義(数牌語のプレフィックス状態) ある 𝑣𝑣
∈ Ω∗ に関して 𝑢𝑢𝑢𝑢 ∈ 𝐷𝐷数牌 となるような 𝑢𝑢 ∈ Ω∗ に対し て,そのプレフィックス状態 𝜎𝜎 を以下で再帰的に定義する: • 𝜎𝜎 𝜀𝜀 = 0,0 • 𝜎𝜎 𝑢𝑢 = (𝑖𝑖, 𝑛𝑛) とするとき, ある 𝑣𝑣 ∈ Ω∗ に関して 𝑢𝑢𝑢𝑢𝑢𝑢 ∈ 𝐷𝐷数牌 となる 𝑐𝑐 ∈ Ω に対して 𝜎𝜎 𝑢𝑢𝑢𝑢 = (𝑖𝑖 + 1, 𝑛𝑛 + 𝑐𝑐) • 定理(数牌言語のプレフィックス定理) ある𝑣𝑣 ∈ Ω∗ , 𝑣𝑣′ ∈ Ω∗ に関して 𝑢𝑢𝑢𝑢 ∈ 𝐷𝐷数牌, 𝑢𝑢′ 𝑣𝑣′ ∈ 𝐷𝐷数牌 となるよ うな 𝑢𝑢 ∈ Ω∗ , 𝑢𝑢′ ∈ Ω∗ に対して, 𝜎𝜎 𝑢𝑢 = 𝜎𝜎 𝑢𝑢𝑢 ならば 𝐸𝐸𝐷𝐷 数牌 𝑢𝑢 = 𝐸𝐸𝐷𝐷 数牌 𝑢𝑢𝑢 である. 𝜎𝜎 𝑢𝑢 = 𝑢𝑢の長さ, 𝑢𝑢の数字の合計 あるプレフィックスを持つ数牌語の総数は,そ のプレフィックスの長さと数字の合計で決まる
21.
数牌言語に対する最小完全ハッシュ関数 の高速計算 𝐻𝐻𝐷𝐷 数牌 𝑤𝑤 = � 𝑐𝑐′<𝑐𝑐0 𝐸𝐸𝐷𝐷
𝑐𝑐′ + ⋯ + � 𝑐𝑐′<𝑐𝑐8 𝐸𝐸𝐷𝐷 𝑐𝑐0𝑐𝑐1 … 𝑐𝑐7𝑐𝑐′ = � 𝑐𝑐′<𝑐𝑐0 𝑇𝑇′ 1, 𝑐𝑐𝑐 + ⋯ + � 𝑐𝑐′<𝑐𝑐8 𝑇𝑇′ 9, 𝑐𝑐0 + 𝑐𝑐1 + ⋯ + 𝑐𝑐7 + 𝑐𝑐′ = 𝑇𝑇 1,0, 𝑐𝑐0 + ⋯ + 𝑇𝑇 9, 𝑐𝑐0 + 𝑐𝑐1 + ⋯ 𝑐𝑐7, 𝑐𝑐8 𝑇𝑇′ 𝑖𝑖, 𝑛𝑛 = プレフィックス状態が 𝑖𝑖, 𝑛𝑛 であるプレフィックスの列挙関数 𝑇𝑇 𝑖𝑖, 𝑛𝑛, 𝑐𝑐 = � 𝑐𝑐′<𝑐𝑐 𝑇𝑇′ 𝑖𝑖, 𝑛𝑛 + 𝑐𝑐𝑐 𝑇𝑇 のサイズは 9 × 15 × 5 = 675 なので事前に計算しておけばよい 任意の数牌語の最小完全ハッシュ関数は 事前計算した9個の値の和だけで計算できてしまう!
22.
数牌言語に対する最小完全ハッシュ関数 を用いた部分置換数のテーブル実装 “000000000” “000000001” “000000002” “000000003” “000000004” … “444110000” “444200000” 0要素目 1要素目 2要素目 3要素目 4要素目 … 435348要素目 435349要素目 キー 値の配列 必要なサイズ: 𝟒𝟒𝟒𝟒𝟒𝟒𝟒𝟒𝟒𝟒𝟒𝟒
× 𝟖𝟖 バイト = 𝟑𝟑𝟑𝟑𝟑𝟑𝟑𝟑𝟑𝟑𝟑𝟑𝟑𝟑 バイト 𝐻𝐻𝐷𝐷 数牌
23.
実験 • tomo氏の実装 https://github.com/tomohxx/shanten-number をベースラインとして速度比較 •
動的計画法の部分はtomo氏の実装とまったく同一 • 1, 2, 4, 5, 7, 8, 10, 11, 13, 14枚のいずれかの枚数の手牌をラン ダムに生成してその向聴数を計算 • 1億回の向聴数計算を行い1回の計算当たりの平均計算時間を算 出 • GCC 11.4.0, -O3 • Intel Core i9-12900
24.
実験 0 10 20 30 40 50 60 向聴数計算1回当たりの計算時間 (ナノ秒) tomo氏の実装 本発表の実装 6倍の高速化
25.
実験結果に対する考察 • 速度が大幅に向上しているが,本来なら動的計画法の部分が律 速になるはずで,その部分が同一実装なのにこれだけの速度向 上は予想外 • テーブルサイズが大幅に小さくなったことによって参照局所性 が向上して結果的に大幅な速度向上につながったか? •
プロファイラを用いたより詳細な検証が必要
26.
まとめ • 向聴数計算における大幅な高速化と省スペース化に成功 • 実装:
https://github.com/Cryolite/nyanten • 各色の牌姿をキーとするあらゆるテーブル実装に応用可能(ex. 有効牌のテーブル化) • 列挙符号を用いた同様のアイデアを麻雀の点数計算の超高速化 に適用したものを開発中 https://github.com/Cryolite/tsumonya なので乞うご期待!
Download