カタラン数を計算してみる、その2
前回はfactorialとcombinationでカタラン数を導出しようと、fact 20くらいであっけなくオーバーフローしたけど、チーター本のP.216ではカタラン数をDPで計算してる。けど、問題の解説見ててがあったほうが分かり易いなと何となく思った*1。
を定義した場合
しなかった場合(書籍の解説より引用)
C0=1
で、の一般項は、本の通りになると腑に落ちた。それだけ*2w−
ってわけのいかないので、それでコード書いてみた。けど、本のサンプルのDPは*3よく分からないので
Ruby*4の再帰で書き下すw−。
$memo = Array.new(10, 0) $memo[0] = 1 def catalan n return $memo[n] unless $memo[n].zero? $memo[n] = (1..n).to_a.reduce(0){|s,i| #p [s,i] p [$memo] s + catalan(n-i) * catalan(i-1) } $memo[n] end
それっぽい答え出てるけど、早いのかどうかわからないw−
P.S.
前回のfactorial使ったのと、今回のrubyコードの時間計測しても大して変わらないな$ time ruby catalan.rb [1, 1] [2, 2] [3, 5] [4, 14] [5, 42] [6, 132] [7, 429] [8, 1430] [9, 4862] [10, 16796] [11, 58786] [12, 208012] [13, 742900] [14, 2674440] [15, 9694845] real 0m0.334s user 0m0.310s sys 0m0.020s$ time ruby catalan_memo.rb [1, 1] [2, 2] [3, 5] [4, 14] [5, 42] [6, 132] [7, 429] [8, 1430] [9, 4862] [10, 16796] [11, 58786] [12, 208012] [13, 742900] [14, 2674440] [15, 9694845] real 0m0.321s user 0m0.300s sys 0m0.010s
最強最速アルゴリズマー養成講座 プログラミングコンテストTopCoder攻略ガイドposted with amazlet at 17.03.21
カタラン数を計算してみる
F#で書いてみたカタラン数は何処かバグっているようで、試しにRubyで書いたらまあ普通に期待値帰ってきたw−
Rubyでカタラン数
$ ruby catalan.rb
1
2
6
1
3
3
[1, 1]
[2, 2]
[3, 5]
[4, 14]
[5, 42]
[6, 132]
[7, 429]
[8, 1430]
[9, 4862]
[10, 16796]
[11, 58786]
[12, 208012]
[13, 742900]
[14, 2674440]
[15, 9694845]
def fact n <<EOS if n == 0 1 else n * fact(n-1) end EOS (1..n).inject(:*) || 1 end def comb(n, r) fact(n) / (fact(r) * fact(n-r)) end def catalan n case n when 0 then 1 else comb(2*n, n) - comb(2*n, n-1) end end puts fact 0 puts fact 2 puts fact 3 puts comb 3, 0 puts comb 3, 1 puts comb 3, 2 (1..15).each{|i| p [i,catalan(i)] }
F#の場合
- rev1: int32で駄目
- rev2: int64にしたけどfactorial 21でオーバーフローしているのでbitintにしないとイケないか
- todo
- rev3: bigint版
- todo
visual studio 2015でのエディタ分割、メモ
忘れては調べてるのでメモ
水平分割
- ウィンドウ -> 分割
垂直分割
- ウィンドウ -> 新規ウィンドウ
- 「タブ部分を右クリック」 -> 垂直タブ グループの新規作成
rubyでdfsでメモ化再帰
いや、早くなるのは分かってたけどめちゃくちゃ早かった*1のでw−
dfs
$ ruby -v ruby 2.1.5p273 (2014-11-13) [arm-linux-gnueabihf] $ time ruby hello_dfs.rb 119759850 real 13m50.176s user 13m50.080s sys 0m0.050s
hello_dfs.rb
$h = 13 $w = 17 def dfs(nowh, noww) return 0 if nowh > $h || noww > $w return 1 if nowh == $h && noww == $w dfs(nowh+1, noww) + dfs(nowh, noww+1) end puts dfs(0, 0)
dfs with memo
$ time ruby hello_dfs2memo.rb
119759850
real 0m0.325s
user 0m0.320s
sys 0m0.010s
hello_dfs2memo.rb
$h = 13 $w = 17 $memo = Array.new($h+1){Array.new($w+1, 0)} def dfs(nowh, noww) return 0 if nowh > $h || noww > $w return 1 if nowh == $h && noww == $w return $memo[nowh][noww] unless $memo[nowh][noww].zero? $memo[nowh][noww] = dfs(nowh+1, noww) + dfs(nowh, noww+1) $memo[nowh][noww] end puts dfs(0, 0)
P.S. 2017/3/10
ちなみに、計測はrasbian on rpi2で*2図ってますw−
with mruby
なんか、知らないけど興味持たれたようなので、mrubyの場合も*3
わーい、YARVよりメモ化再帰が、はやーい。すごーい。$ ~/git/mruby/bin/mruby -v mruby 1.2.0 (2015-11-17) $ time ~/git/mruby/bin/mruby hello_dfs.rb 119759850 real 48m11.377s user 48m11.260s sys 0m0.010s $time ~/git/mruby/bin/mruby hello_dfs2memo.rb 119759850 real 0m0.064s user 0m0.050s sys 0m0.010s
sshからOP-TEEのQEMU環境実行方法
デフォルトだと、GUIのxtermが立ち上がる設定なので、sshのCUIでは失敗します。
ので、すこしMakefileいじってやっることによってCUIから起動させました。
Makefileの修正
xtermが勝手に立ち上がるのを無効にします。
diff --git a/qemu_v8.mk b/qemu_v8.mk index 0dded16..7351c7e 100644 --- a/qemu_v8.mk +++ b/qemu_v8.mk @@ -221,8 +221,6 @@ run: all .PHONY: run-only run-only: $(call run-help) - $(call launch-terminal,54320,"Normal World") - $(call launch-terminal,54321,"Secure World") $(call wait-for-ports,54320,54321) cd $(ARM_TF_PATH)/build/qemu/release && \ $(QEMU_PATH)/aarch64-softmmu/qemu-system-aarch64 \
soc_termの手動起動
で、上記で勝手に起動されていたSecure/NonSecureの、soc_termを手動で起動します。
コンソールを別に2個用意して、下記でQEMUからの接続待ちさせてください
Secure
$ ~/devel/optee/soc_term$ ./soc_term 54321
NonSecure
$ ~/devel/optee/soc_term$ ./soc_term 54320
簡単なlinuxカーネル開発環境の構築メモ
$ cat /etc/debian_version 8.7 $ uname -a Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.39-1 (2016-12-30) x86_64 GNU/Linux
構築メモ
/etc/libvirt/libvirtd.confの編集
#unix_sock_group = "libvirtd" #unix_sock_ro_perms = "0777" #auth_unix_ro = "none" #auth_unix_rw = "none"以下コマンドで/etc/groupに自身のユーザを追加
# groupadd -g 900 libvirtd $ id uid=1000(murase) ### この自分のユーザ名を以下で追加 # usermod -G libvirtd -a murase # systemctl restart libvirtdvagrant-libvirtをインストール
最新の0.0.37だと失敗したので古いのでw−
$ vagrant plugin install --plugin-version 0.0.35 vagrant-libvirtelkdatでboxをインストール
で、あとはgit cloneしたelkdatで、./initするだけど環境が構築される(スバラです><*6
murase@debian:~/github$ cd elkdat/ murase@debian:~/github/elkdat$ ls LICENSE README.md elkdat example fini init ktest test murase@debian:~/github/elkdat$ ln -s ../linux-stable linux murase@debian:~/github/elkdat$ ./init + vagrant box add elastic/ubuntu-16.04-x86_64 --provider libvirt Ignoring ruby-libvirt-0.7.0 because its extensions are not built. Try: gem pristine ruby-libvirt --version 0.7.0 ==> box: Loading metadata for box 'elastic/ubuntu-16.04-x86_64' box: URL: https://atlas.hashicorp.com/elastic/ubuntu-16.04-x86_64 ==> box: Adding box 'eIgnoring ruby-libvirt-0.7.0 because its extensions are not built. Try: gem pristine ruby-libvirt --version 0.7.0 Bringing machine 'ktest' up with 'libvirt' provider... ==> ktest: Uploading base box image as volume into libvirt storage... ==> ktest: Creating image (snapshot of base box volume). lastic/ubuntu-16.04-x86_64' (v20161120.0.0) for provider: libvirt box: Downloading: https://atlas.hashicorp.com/elastic/boxes/ubuntu-16.04-x86_64/versions/20161120.0.0/providers/libvirt.box ==> box: Successfully added box 'elastic/ubuntu-16.04-x86_64' (v20161120.0.0) for 'libvirt'! + pushd elkdat ~/github/elkdat/elkdat ~/github/elkdat + vagrant up Ignoring ruby-libvirt-0.7.0 because its extensions are not built. Try: gem pristine ruby-libvirt --version 0.7.0 Bringing machine 'ktest' up with 'libvirt' provider... ==> ktest: Uploading base box image as volume into libvirt storage... ==> ktest: Creating image (snapshot of base box volume). ...残りはqiitaの手順にしたがっていろいろやってみるぞい
P.S. 600個目の記事っぽいw−b
組み込みのちっちゃい系OSメモ
お仕事がそっち系で、まあ勉強しないと行けないのでw−
手始めにxv6コード読みと弄りしたいと思うが、序にいろいろ調べたのをペタペタしておく。
- xv6(x86用のUNIX v6)
- https://ja.wikipedia.org/wiki/Xv6
- ソースコード : GitHub - mit-pdos/xv6-public: xv6 OS
- ビルド xv6 on Qemu : Unix v6 on Qemu setup guide - Qiita
- make修正しなくても、make qemu-noxで行けた?
- ユーザランド弄り方 : Xv6を使ってみる – dyama's page
- OPTEE(TrustedOS, ARMのTrustZoneで動くOS。SecureMonitor(ARM Trusted Firmware)と一緒に)
- Mini-OS(xenをカスタムしたhypervisorレイヤで動くOS?)
- Zephyr(Linux Foundation作成の組み込みOS)
- mbed(ARM作成のCoretex-M系組み込みOS、ユーザランドスタック、及びWeb開発環境)
- McKernel(メニーコアクラスタ用の組み込みOS(仮想linuxレイヤ?))