<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>R | My Interests</title>
	<atom:link href="https://ds.machijun.net/tag/r/feed/" rel="self" type="application/rss+xml" />
	<link>https://ds.machijun.net/</link>
	<description>残したいことを残していきます</description>
	<lastBuildDate>Sun, 19 May 2019 15:31:25 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.14</generator>
	<item>
		<title>サンプル分位数の漸近正規性を確かめる</title>
		<link>https://ds.machijun.net/%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e5%88%86%e4%bd%8d%e6%95%b0%e3%81%ae%e6%bc%b8%e8%bf%91%e6%ad%a3%e8%a6%8f%e6%80%a7%e3%82%92%e7%a2%ba%e3%81%8b%e3%82%81%e3%82%8b/</link>
		<pubDate>Sun, 19 May 2019 07:49:14 +0000</pubDate>
		<dc:creator><![CDATA[jun]]></dc:creator>
				<category><![CDATA[R]]></category>
		<category><![CDATA[サンプル分位数]]></category>
		<category><![CDATA[シミュレーション]]></category>
		<category><![CDATA[標本分位数]]></category>

		<guid isPermaLink="false">https://ds.machijun.net/?p=4616</guid>
		<description><![CDATA[<p>サンプル分位数の漸近正規性 サンプル分位数の漸近正規性で示した通り次が成り立ちます. $0 &#60; p &#60; 1$とし, 確率分布関数$F$が密度関数$f$を$Q_p$の近傍で持ち, $f$が$Q_p$で正であり連 [&#8230;]</p>
<p>The post <a href="https://ds.machijun.net/%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e5%88%86%e4%bd%8d%e6%95%b0%e3%81%ae%e6%bc%b8%e8%bf%91%e6%ad%a3%e8%a6%8f%e6%80%a7%e3%82%92%e7%a2%ba%e3%81%8b%e3%82%81%e3%82%8b/">サンプル分位数の漸近正規性を確かめる</a> first appeared on <a href="https://ds.machijun.net/">My Interests</a>.</p>]]></description>
				<content:encoded><![CDATA[<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS_CHTML" type="text/javascript">    
    MathJax.Hub.Config({
        HTML: ["input/TeX","output/HTML-CSS"],
        TeX: {
               Macros: {
                        bm: ["\\boldsymbol{#1}", 1],
                        argmax: ["\\mathop{\rm arg\,max}\limits"],
                        argmin: ["\\mathop{\rm arg\,min}\limits"]},
						
               extensions: ["AMSmath.js","AMSsymbols.js","color.js"],
               equationNumbers: { autoNumber: "AMS" } },
        extensions: ["tex2jax.js"],
        jax: ["input/TeX","output/HTML-CSS"],
        tex2jax: { inlineMath: [ ['$','$'], ["\\(","\\)"] ],
                   displayMath: [ ['$$','$$']], 
                   processEscapes: true },
        "HTML-CSS": { availableFonts: ["TeX"],
                      linebreaks: { automatic: true } }
    });
</script>

$\newcommand{\lnl}{\\[8pt]}$
$\newcommand{\Lnl}{\\[18pt]}$
$\newcommand{\delt}{\mathrm{d}}$
$\newcommand{\comb}{\mathrm{C}}$
$\DeclareMathOperator*{\ssum}{\Sigma}$
$\DeclareMathOperator*{\sprod}{\Pi}$
<h2>サンプル分位数の漸近正規性</h2>
<p><a href="/%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e5%88%86%e4%bd%8d%e6%95%b0%e3%81%ae%e6%bc%b8%e8%bf%91%e6%ad%a3%e8%a6%8f%e6%80%a7/">サンプル分位数の漸近正規性</a>で示した通り次が成り立ちます.</p>
<div class="theorem">$0 &lt; p &lt; 1$とし, 確率分布関数$F$が密度関数$f$を$Q_p$の近傍で持ち, $f$が$Q_p$で正であり連続ならば,<br />
<div style="overflow-x: auto;">\begin{align}<br />
\hat{Q}_{pn} \xrightarrow{d} \mathrm{N}\left(Q_p,\frac{p(1-p)}{f(Q_p)^2n}\right)<br />
\end{align}</div><br />
となる.</div>
<p>今回は, この定理が本当に成り立っているのかRを使ってシミュレーションしていきましょう.</p>
<h2>シミュレーション</h2>
<h3>$F$が正規分布の場合</h3>
<p>$F$を$\mathrm{N}(50,10^2)$に従う場合でシミュレーションしてみます.<br />
$n= 100 , p = 0.3$とします.<br />
この場合, $Q_p \fallingdotseq 44.756 , f(Q_p) \fallingdotseq 0.03477$なので,<br />
<div style="overflow-x: auto;">\begin{align}<br />
\hat{Q}_{0.3} \xrightarrow{d} \mathrm{N}\left(44.756,1.737\right)<br />
\end{align}</div><br />
となるはずです.シミュレーションにより$\hat{Q}_p$を独立に$10000$個生成し上記の正規分布に従うか確認してみます.</p>
<p>Rのコードは次のようになります.</p>
<pre class="brush: r; title: ; notranslate">
loop &lt;- 1:10000 # Qpを計算する回数
n &lt;- 100 #各回で利用するサンプル数
p &lt;- 0.3 #分位点の位置

mean &lt;- 50 # Fの従う正規分布の平均
sd &lt;- 10 # Fの従う正規分布の標準偏差

qp &lt;- qnorm(mean = mean,sd = sd,p = p) # 真のQpの値
f_qp &lt;- dnorm(mean=mean,sd=sd,x = qp) #真のf(Qp)の値

qps = c() # 各回のQpを格納
for(i in loop){
  # サンプルをn個作成
  x &lt;- rnorm(n,mean=mean,sd=sd)
  z = sort(x)[ceiling(n*p)] #標本分位点
  qps &lt;- rbind(qps,c(z))
}
plot(density(qps)) #得られたQpの分布から密度関数を推定しプロット
# 収束先の分布をプロット
curve(dnorm(x,mean=qp,sd=sqrt(p*(1-p)/n)/f_qp),add = T,col=&quot;red&quot;)
</pre>
<p>実行結果：<br />
<img class="aligncenter wp-image-4625 size-medium" src="https://imgds.machijun.net/wp-content/uploads/2019/05/19014035/img_5ce0358304edc-276x300.png" alt="" width="276" height="300" srcset="https://imgds.machijun.net/wp-content/uploads/2019/05/19014035/img_5ce0358304edc-276x300.png 276w, https://imgds.machijun.net/wp-content/uploads/2019/05/19014035/img_5ce0358304edc.png 614w" sizes="(max-width: 276px) 100vw, 276px" /></p>
<p>黒線がシミュレーションで生成した$\hat{Q}_p$で赤線が収束先の分布, つまり$\mathrm{N}\left(44.756,1.737\right)$です.<br />
よく一致していることがわかります.</p>
<h3>$F$がカイ二乗分布の場合</h3>
<p>$F$を$\chi^2(8)$に従う場合でシミュレーションしてみます.<br />
$n= 200 , p = 0.7$とします.<br />
この場合, $Q_p \fallingdotseq 9.524 , f(Q_p) \fallingdotseq 0.0769$なので,<br />
<div style="overflow-x: auto;">\begin{align}<br />
\hat{Q}_{0.7} \xrightarrow{d} \mathrm{N}\left(9.524,0.1775\right)<br />
\end{align}</div><br />
となるはずです.シミュレーションにより$\hat{Q}_p$を独立に$10000$個生成し上記の正規分布に従うか確認してみます.</p>
<p>Rのコードは次のようになります.</p>
<pre class="brush: r; title: ; notranslate">
loop &lt;- 1:10000 # Qpを計算する回数
n &lt;- 200 #各回で利用するサンプル数
p &lt;- 0.7 #分位点の位置

df &lt;- 8 # Fの従うカイ二乗分布の自由度

qp &lt;- qchisq(df = df,p = p) # 真のQpの値
f_qp &lt;- dchisq(df = df,x = qp) #真のf(Qp)の値


qps = c() # 各回のQpを格納
for(i in loop){
  # サンプルをn個作成
  x &lt;- rchisq(n,df = df)
  
  z = sort(x)[ceiling(n*p)] #標本分位点
  qps &lt;- rbind(qps,c(z))
}
plot(density(qps)) #得られたQpの分布から密度関数を推定しプロット
# 収束先の分布をプロット
curve(dnorm(x,mean=qp,sd=sqrt(p*(1-p)/n)/f_qp),add = T,col=&quot;red&quot;)
</pre>
<p>実行結果：<br />
<img alt='' class='aligncenter size-full wp-image-4629 size-medium' src='https://imgds.machijun.net/wp-content/uploads/2019/05/19014942/img_5ce037a6bbe3c.png' width="276" height="300"/></p>
<p>黒線がシミュレーションで生成した$\hat{Q}_p$で赤線が収束先の分布, つまり$\mathrm{N}\left(9.524,0.1775\right)$です.<br />
よく一致していることがわかります.</p><p>The post <a href="https://ds.machijun.net/%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e5%88%86%e4%bd%8d%e6%95%b0%e3%81%ae%e6%bc%b8%e8%bf%91%e6%ad%a3%e8%a6%8f%e6%80%a7%e3%82%92%e7%a2%ba%e3%81%8b%e3%82%81%e3%82%8b/">サンプル分位数の漸近正規性を確かめる</a> first appeared on <a href="https://ds.machijun.net/">My Interests</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>Rでヴィジュネル暗号を解く</title>
		<link>https://ds.machijun.net/r%e3%81%a7%e3%83%b4%e3%82%a3%e3%82%b8%e3%83%a5%e3%83%8d%e3%83%ab%e6%9a%97%e5%8f%b7%e3%82%92%e8%a7%a3%e3%81%8f/</link>
		<comments>https://ds.machijun.net/r%e3%81%a7%e3%83%b4%e3%82%a3%e3%82%b8%e3%83%a5%e3%83%8d%e3%83%ab%e6%9a%97%e5%8f%b7%e3%82%92%e8%a7%a3%e3%81%8f/#comments</comments>
		<pubDate>Fri, 30 Mar 2018 02:57:42 +0000</pubDate>
		<dc:creator><![CDATA[jun]]></dc:creator>
				<category><![CDATA[R]]></category>
		<category><![CDATA[ヴィジュネル]]></category>
		<category><![CDATA[暗号]]></category>

		<guid isPermaLink="false">https://machijun.net/?p=1054</guid>
		<description><![CDATA[<p>目的 Rで「ヴィジュネル暗号」を解きながら次のようなことを学びます。 &#8211; χ二乗検定を用いて既知の頻度分布と、手元のデータの分布が一致するか調べることができる。 &#8211; Rの（癖のある）文字列操作をち [&#8230;]</p>
<p>The post <a href="https://ds.machijun.net/r%e3%81%a7%e3%83%b4%e3%82%a3%e3%82%b8%e3%83%a5%e3%83%8d%e3%83%ab%e6%9a%97%e5%8f%b7%e3%82%92%e8%a7%a3%e3%81%8f/">Rでヴィジュネル暗号を解く</a> first appeared on <a href="https://ds.machijun.net/">My Interests</a>.</p>]]></description>
				<content:encoded><![CDATA[<h2>目的</h2>
<p>Rで「ヴィジュネル暗号」を解きながら次のようなことを学びます。<br />
&#8211; χ二乗検定を用いて既知の頻度分布と、手元のデータの分布が一致するか調べることができる。<br />
&#8211; Rの（癖のある）文字列操作をちょっとできるようになる。<br />
<span id="more-1054"></span><br />
<p class="ad-label">スポンサーリンク</p>
<div class="ad-innercontents">
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- machijun.net-incontent -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-0727807216839004"
     data-ad-slot="9340959476"
     data-ad-format="auto"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</p>
<h2>今回解読する暗号文</h2>
<blockquote><p>sqxoipqubqafvblrpbbqeuddebwucqgjhoiotrrwuvilhgjrkjukvzeavlkuavdkujpdqybpfldpglsuqkqiyoguqonpgauqkfxjrfwljugsoecqvfjvqqqxnvdibzgqxhreubqgggbghcokejyhxhrgqdqtggfdniubqgelsyyydojruwfdtykbjuguqxnvqxjvqqlhnpbkqgkrkiberksrkybtnpgpeqggfsnvhasnpoldtgqakegzbqegpbjbpddhrcwyqgvobvvgoaesvkxjjcutuucybsbohqeqggfsnvhxfbtwfeaqiqxnvifuyfdpqskqxbegvqyaisiqpgilhgjrpujjreuegjxlrvkbyenlsufvkxjgjhkqgkrkcvikqbvxhfjvudijbihqxrtifjgkqdqafsoecguqxnvzbiuqxitqqweyfdxqyacoxhtgupuauhtupcqkegfhaypcwbmredkdbvfldfgfoqggzbsnpqljucoiejvkfittrrdqvkbrecybcrpoflvpjxdqfhxtjjrpjewjdbrfkbhrjdsupqqpuptdquqkwcqecellrqxofbqumejguqenfglhqgwoqpvweujquitjkoibvvwiuaqwbdbtoldtthjuzdhomucwtufcbeuegerjvvfxdagybhsqudugykxjgjhvtvfkbhrkwfisqurigjhiyikqdhnvkbhgqebtrflzqgggeuegwljugxkvvplpxrfzlhxykfsuvkbojjrcehikqxrtheqigwekfhdoibpryblcgsqaehaygkvoqgjhovbtxpjbdheueggbtvedquqvrqxriubqgvdpaegpxyakqdrrhrouhuweqghulcgjhpuuqqlhrfgbqqyhqqxglksegdpuqfhsegkrkjbvkxjpcxpusqutxvekqxrajxlrvkbbnuwckynpbqfwubesfhsegkrkjucwtuugubxvikioegvlbigweqgvkbirfhxtfjdibaqweqiggfuqkqsqvpweqgvkfiacwfeawqaueiraiucoixnxhxdryefhgjrcveghaezcqajucwdeigukcrpwlvgjhmubrobrlvkbfrqsiusquqxrrhlfygveqynqljcgufiuhulcgjhbqevkce</p></blockquote>
<p>なお平文に関して以下は既知とします。</p>
<ul>
<li>アルファベット小文字（26文字）のみ</li>
<li>ヴィジュネル暗号を使っていることは既知</li>
</ul>
<h2>暗号解読の方針</h2>
<p>ヴィジュネル暗号は次の解き方がよく知られています。</p>
<ul>
<li>鍵の長さを推定する</li>
<li>鍵の長さに従って文字列を分割し、頻度解析を行う</li>
</ul>
<p>今回は鍵の長さを推定するところをRをうまく使ってみたいと思います。</p>
<h2>解読作業</h2>
<h3>暗号文をRに読み込ませる</h3>
<pre class="brush: r; title: ; notranslate">
#暗号文を変数にいれる
crypt = &quot;sqxoipqubqafvblrpbbqeuddebwucqgjhoiotrrwuvilhgjrkjukvzeavlkuavdkujpdqybpfldpglsuqkqiyoguqonpgauqkfxjrfwljugsoecqvfjvqqqxnvdibzgqxhreubqgggbghcokejyhxhrgqdqtggfdniubqgelsyyydojruwfdtykbjuguqxnvqxjvqqlhnpbkqgkrkiberksrkybtnpgpeqggfsnvhasnpoldtgqakegzbqegpbjbpddhrcwyqgvobvvgoaesvkxjjcutuucybsbohqeqggfsnvhxfbtwfeaqiqxnvifuyfdpqskqxbegvqyaisiqpgilhgjrpujjreuegjxlrvkbyenlsufvkxjgjhkqgkrkcvikqbvxhfjvudijbihqxrtifjgkqdqafsoecguqxnvzbiuqxitqqweyfdxqyacoxhtgupuauhtupcqkegfhaypcwbmredkdbvfldfgfoqggzbsnpqljucoiejvkfittrrdqvkbrecybcrpoflvpjxdqfhxtjjrpjewjdbrfkbhrjdsupqqpuptdquqkwcqecellrqxofbqumejguqenfglhqgwoqpvweujquitjkoibvvwiuaqwbdbtoldtthjuzdhomucwtufcbeuegerjvvfxdagybhsqudugykxjgjhvtvfkbhrkwfisqurigjhiyikqdhnvkbhgqebtrflzqgggeuegwljugxkvvplpxrfzlhxykfsuvkbojjrcehikqxrtheqigwekfhdoibpryblcgsqaehaygkvoqgjhovbtxpjbdheueggbtvedquqvrqxriubqgvdpaegpxyakqdrrhrouhuweqghulcgjhpuuqqlhrfgbqqyhqqxglksegdpuqfhsegkrkjbvkxjpcxpusqutxvekqxrajxlrvkbbnuwckynpbqfwubesfhsegkrkjucwtuugubxvikioegvlbigweqgvkbirfhxtfjdibaqweqiggfuqkqsqvpweqgvkfiacwfeawqaueiraiucoixnxhxdryefhgjrcveghaezcqajucwdeigukcrpwlvgjhmubrobrlvkbfrqsiusquqxrrhlfygveqynqljcgufiuhulcgjhbqevkce&quot;

#1文字ずつ分解する strsplitはListを返す。配列化のためunlistする
crypt.split = unlist(strsplit(crypt,&quot;&quot;))
</pre>
<p>暗号文を1文字ずつ分割します。<br />
1文字ずつ分割するにはstrsplitを使います。<br />
strsplitはListを返すため unlistを使い配列化します。</p>
<h3>アルファベットの頻度分布表を準備</h3>
<pre class="brush: r; title: ; notranslate">
#アルファベットの頻度分布表のデータを用意する
table_freq = c(0.0817,0.0149,0.0278,0.0425,0.1268,0.0223,0.0202,0.0609,0.0697,0.0015,0.0077,0.0403,0.0241,0.0675,0.0751,0.0193,0.001,0.0599,0.0633,0.0906,0.0276,0.0098,0.0236,0.0015,0.0197,0.0007)

#後ほど使いやすいようにソートする
table_freq.sort = sort(table_freq)
#factorは後ほど使います
table_freq.factor = c(&quot;a&quot;,&quot;b&quot;,&quot;c&quot;,&quot;d&quot;,&quot;e&quot;,&quot;f&quot;,&quot;g&quot;,&quot;h&quot;,&quot;i&quot;,&quot;j&quot;,&quot;k&quot;,&quot;l&quot;,&quot;m&quot;,&quot;n&quot;,&quot;o&quot;,&quot;p&quot;,&quot;q&quot;,&quot;r&quot;,&quot;s&quot;,&quot;t&quot;,&quot;u&quot;,&quot;v&quot;,&quot;w&quot;,&quot;x&quot;,&quot;y&quot;,&quot;z&quot;)
</pre>
<p>アルファベットの頻度分布表は以下から拝借しました。（合計が1となるよう少し数字を変えています）<br />
<a href="http://www.weblio.jp/wkpja/content/英語アルファベット_文字の出現頻度" rel="noopener" target="_blank">Weblio 辞書 文字の出現頻度</a></p>
<h3>鍵長を探す</h3>
<p>鍵の長さをnと仮定し、暗号文からn文字ごとに文字を拾ってきて、アルファベットの頻度分布と比べます。</p>
<p>例えば暗号文が次のようになっているとして、n=3の場合を考えます。</p>
<table>
<tr>
<th>index</th>
<th>1</th>
<th>2</th>
<th>3</th>
<th>4</th>
<th>5</th>
<th>6</th>
<th>7</th>
<th>8</th>
<th>9</th>
<th>10</th>
<th>11</th>
<th>12</th>
<th>13</th>
<th>14</th>
<th>15</th>
</tr>
<tr>
<td>暗号文</td>
<td><span style="color: #2196f3;">a</span></td>
<td><span style="color: #00cc00;">b</span></td>
<td><span style="color: #ff5252;">c</span></td>
<td><span style="color: #2196f3;">d</span></td>
<td><span style="color: #00cc00;">a</span></td>
<td><span style="color: #ff5252;">b</span></td>
<td><span style="color: #2196f3;">c</span></td>
<td><span style="color: #00cc00;">d</span></td>
<td><span style="color: #ff5252;">a</span></td>
<td><span style="color: #2196f3;">b</span></td>
<td><span style="color: #00cc00;">c</span></td>
<td><span style="color: #ff5252;">d</span></td>
<td><span style="color: #2196f3;">a</span></td>
<td><span style="color: #00cc00;">b</span></td>
<td><span style="color: #ff5252;">c</span></td>
</tr>
</table>
<p>この場合、3つの文字の集合に分割できます。</p>
<ul>
<li><span style="color: #2196f3;">index1から始まって3文字ごとに拾った文字集合1：「adcba」</span></li>
<li><span style="color: #00cc00;">index2から始まって3文字ごとに拾った文字集合2：「badcb」</span></li>
<li><span style="color: #ff5252;">index3から始まって3文字ごとに拾った文字集合3：「cbadc」</span></li>
</ul>
<p>それぞれ集合の文字の度数分布表を作成し、アルファベットの頻度分布表に従っているかを見ていくことで、鍵長を推測します。<br />
nが鍵長であれば、すべての集合がアルファベットの頻度表とよく一致するはずです。</p>
<h4>n=1</h4>
<p>n=1の場合は、ヴィジュネル暗号ではなくシーザー暗号というのですが、気にせず計算してみます。</p>
<pre class="brush: r; title: ; notranslate">
n = 1

# n行のマトリックス＝n文字ごとに文字を拾う
c.split = matrix(crypt.split,n)

#1行目を抜き出して度数分布を作る。
#1度も利用されていないアルファベット文字も度数分布表に出てくるよう、factorを用いる。
#度数順にソートする
X.1 = sort(table(factor(c.split[1,],levels=table_freq.factor)))

#χ二乗検定でX.1と頻度分布表を比べる
chisq.test(x=X.1,p = table_freq.sort)
</pre>
<blockquote><p>X-squared = 759.61, df = 25, p-value &lt; 2.2e-16</p></blockquote>
<p>χ二乗検定の結果は上記のようになりました。<br />
見るべき値は有意水準（p-value）です。<br />
伝統的に有意水準を1%,5%,10%など決めて、その範囲を逸脱したら棄却するという風に検定を行います。今回は短い文なので10%ぐらいに設定したいと思います（つまり、p-valueが0.9以上で採択する）。<br />
改めて出力されたp-valueを見ると、とても小さい値なので棄却です。</p>
<h4>n=2</h4>
<p>続けてn=2を見ていきましょう。<br />
ここからは複数の文字集合が出てくるのですが1つずつ見てみます。<br />
もし、1つ目で希望が持てなければ次のnを試します。</p>
<pre class="brush: r; title: ; notranslate">
n = 2

# n行のマトリックス＝n文字ごとに文字を拾う
c.split = matrix(crypt.split,n)

# 1行目を抜き出して度数分布を作る。
#1度も利用されていないアルファベット文字も度数分布表に出てくるよう、factorを用いる。
X.1 = sort(table(factor(c.split[1,],levels=table_freq.factor)))

#χ二乗検定でX.1と頻度分布表を比べる
chisq.test(x=X.1,p = table_freq.sort)
</pre>
<blockquote><p>X-squared = 279.19, df = 25, p-value &lt; 2.2e-16</p></blockquote>
<p>n=2の時も一致していないといえます。</p>
<h4>n=5</h4>
<p>いきなり飛んで申し訳ないですが、n=3,n=4も同様にみて、ダメだったとします。<br />
n=5の場合はどうでしょうか。</p>
<pre class="brush: r; title: ; notranslate">
n = 5

# n行のマトリックス＝n文字ごとに文字を拾う
c.split = matrix(crypt.split,n)

# 1行目を抜き出して度数分布を作る。
#1度も利用されていないアルファベット文字も度数分布表に出てくるよう、factorを用いる。
X.1 = sort(table(factor(c.split[1,],levels=table_freq.factor)))

#χ二乗検定でX.1と頻度分布表を比べる
chisq.test(x=X.1,p = table_freq.sort)
</pre>
<blockquote><p>X-squared = 6.5934, df = 25, p-value = 0.9999</p></blockquote>
<p>有意水準が0.9999とかなり高い値が出ました。<br />
希望が持てます。</p>
<p>念のため、2～5行目も試してみます。</p>
<pre class="brush: r; title: ; notranslate">
#2～5行目もやってみます。
X.2 = sort(table(factor(c.split[2,],levels=table_freq.factor)))
X.3 = sort(table(factor(c.split[3,],levels=table_freq.factor)))
X.4 = sort(table(factor(c.split[4,],levels=table_freq.factor)))
X.5 = sort(table(factor(c.split[5,],levels=table_freq.factor)))

chisq.test(x=X.2,p = table_freq.sort)
#p-value = 0.6647

chisq.test(x=X.3,p = table_freq.sort)
#p-value = 0.9963

chisq.test(x=X.4,p = table_freq.sort)
#p-value = 0.9598

chisq.test(x=X.5,p = table_freq.sort)
#p-value = 0.9256
</pre>
<p>いずれもとてもよく一致しているといえるので鍵長は5と推定できました。</p>
<h3>復号化</h3>
<p>鍵長がわかったので復号化をします。</p>
<h4>鍵を求める</h4>
<p>5つの文字セットそれぞれの鍵を突き止める必要があります。<br />
暗号文字の出現回数から平文字を推測します。<br />
まずは、暗号文字の出現回数を眺めてみます。</p>
<pre class="brush: r; title: ; notranslate">
X.1
</pre>
<blockquote><p>d k m w l o x c h z i y t f s p j q a b v n u e r g<br />
0 0 0 0 2 2 2 3 3 3 5 5 6 7 8 9 10 13 15 15 15 16 16 18 28 29</p></blockquote>
<p>gやrの出現回数が他の文字に比べて多いですね。<br />
ここで、通常のアルファベットの頻度分布表を出現率の昇順に並べてみます。</p>
<blockquote><p>Z Q J X K V B P Y G F W M U C L D R H S N I O A T E</p></blockquote>
<p>出現率はE：12.7% , T：9.06%となっており圧倒的にEが多く出現することがわかります。そのため、鍵探しはEが何に対応するかを考えながら行います。</p>
<p>X.1の度数表ではg,rの出現率が高くなっていました。このいずれかがEであると考えてみます。</p>
<ul>
<li>gをEになるように置換する(鍵&#8221;25&#8243;に相当)</li>
<li>通常のアルファベットで頻度分布の上位に来る 「E,T,A,O,I」に対応するものは「G,V,C,Q,K」となります。これはX.1の度数分布で上位を占めているとはいいがたいですね。</li>
<li>rをEになるように置換する(鍵&#8221;14&#8243;に相当)</li>
<li>同様に考えると、「E,T,A,O,I」に対応するものは「R,G,N.B,V」となります。これはX.1の度数分布の上位を占めているので鍵の1文字目は&#8221;14&#8243;と考えられます。</li>
</ul>
<p>同様にX.2～X.5から鍵の2～5文字目を探します。<br />
結果だけ書くと、鍵は 14,3,4,24,17となりました。</p>
<h3>復号化する</h3>
<p>いよいよ復号化です。</p>
<pre class="brush: r; title: ; notranslate">
#鍵1～26に対応した変換表
key_list = c(
 &quot;a-z&quot;, # 鍵&quot;1&quot;に対応
 &quot;za-y&quot;,# 鍵&quot;2&quot;に対応(以下同様)
 &quot;y-za-x&quot;, &quot;x-za-w&quot;, &quot;w-za-v&quot;, &quot;v-za-u&quot;, &quot;u-za-t&quot;, &quot;t-za-s&quot;, &quot;s-za-r&quot;, &quot;r-za-q&quot;, &quot;q-za-p&quot;, &quot;p-za-o&quot;,
 &quot;o-za-n&quot;, &quot;n-za-m&quot;, &quot;m-za-l&quot;, &quot;l-za-k&quot;, &quot;k-za-j&quot;, &quot;j-za-i&quot;, &quot;i-za-h&quot;, &quot;h-za-g&quot;, &quot;g-za-f&quot;, &quot;f-za-e&quot;,
 &quot;e-za-d&quot;, &quot;d-za-c&quot;, &quot;c-za-b&quot;, &quot;b-za&quot;
)

#鍵を順番通りに配列にセットする
key = c(key_list[14],key_list[3],key_list[4],key_list[24],key_list[17])

#各成分に鍵を適用する
p.l1 = chartr(&quot;a-z&quot;,key[1],c.split[1,])
p.l2 = chartr(&quot;a-z&quot;,key[2],c.split[2,])
p.l3 = chartr(&quot;a-z&quot;,key[3],c.split[3,])
p.l4 = chartr(&quot;a-z&quot;,key[4],c.split[4,])
p.l5 = chartr(&quot;a-z&quot;,key[5],c.split[5,])

#１つの文字列に連結する
decrypt.matrix = rbind(p.l1,p.l2,p.l3,p.l4,p.l5)
decrypt.split = paste(decrypt.matrix[,])
decrypt = paste(decrypt.split,collapse=&quot;&quot;)

#平文
decrypt
</pre>
<blockquote><p>fourscoreandsevenyearsagoourfathersbroughtforthonthiscontinentanewnationconceivedinlibertyanddedicatedtothepropositionthatallmenarecreatedequalnowweareengagedinagreatcivilwartestingwhetherthatnationoranynationsoconceivedandsodedicatedcanlongendurewearemetonagreatbattlefieldofthatwarwehavecometodedicateaportionofthatfieldasafinalrestingplaceforthosewhoheregavetheirlivesthatthenationmightliveitisaltogetherfittingandproperthatweshoulddothisbutinalargersensewecannotdedicatewecannotconsecratewecannothallowthisgroundthebravemenlivinganddeadwhostruggledherehaveconsecrateditfaraboveourpoorpowertoaddordetracttheworldwilllittlenotenorlongrememberwhatwesayherebutitcanneverforgetwhattheydidhereitisforusthelivingrathertobededicatedheretotheunfinishedworkwhichtheywhofoughtherehavethusfarsonoblyadvanceditisratherforustobeherededicatedtothegreattaskremainingbeforeusthatfromthesehonoreddeadwetakeincreaseddevotiontothatcauseforwhichtheygavethelastfullmeasureofdevotionthatweherehighlyresolvethatthesedeadshallnothavediedinvainthatthisnationundergodshallhaveanewbirthoffreedomandthatgovernmentofthepeoplebythepeopleforthepeopleshallnotperishfromtheearthfo</p></blockquote>
<p>スペースやハイフン、カンマがなくて読みづらいですが、リンカーンの「ゲティスバーグ演説」でした。<br />
<a href="https://americancenterjapan.com/aboutusa/translations/2390/#enlist" rel="noopener" target="_blank">参考</a></p><p>The post <a href="https://ds.machijun.net/r%e3%81%a7%e3%83%b4%e3%82%a3%e3%82%b8%e3%83%a5%e3%83%8d%e3%83%ab%e6%9a%97%e5%8f%b7%e3%82%92%e8%a7%a3%e3%81%8f/">Rでヴィジュネル暗号を解く</a> first appeared on <a href="https://ds.machijun.net/">My Interests</a>.</p>]]></content:encoded>
			<wfw:commentRss>https://ds.machijun.net/r%e3%81%a7%e3%83%b4%e3%82%a3%e3%82%b8%e3%83%a5%e3%83%8d%e3%83%ab%e6%9a%97%e5%8f%b7%e3%82%92%e8%a7%a3%e3%81%8f/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
