<?xml version="1.0" encoding="utf-8" ?>


<?xml-stylesheet href="http://d.hatena.ne.jp/siokoshou/rssxsl" type="text/xsl" media="screen"?>


<rdf:RDF
	xmlns="http://purl.org/rss/1.0/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xml:lang="ja">
<channel rdf:about="http://d.hatena.ne.jp/siokoshou/rss">
	<title>当面C#と.NETな記録</title>
	<link>http://d.hatena.ne.jp/siokoshou/</link>
	<description>当面C#と.NETな記録</description>
	
	<dc:creator>siokoshou</dc:creator>
	<dc:date>2010-01-07T17:09:38+09:00</dc:date>
	<items>
	<rdf:Seq>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/siokoshou/20091219#p1"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/siokoshou/20091119#p1"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/siokoshou/20091117#p1"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/siokoshou/20091115#p1"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/siokoshou/20091115#p2"/>
		<rdf:li rdf:resource="http://d.hatena.ne.jp/siokoshou/20091114#p1"/>
	</rdf:Seq>
	</items>
</channel>



<item rdf:about="http://d.hatena.ne.jp/siokoshou/20091219#p1">
	<title>[C#] 除算と剰余の整数オーバーフロー</title>
	<link>http://d.hatena.ne.jp/siokoshou/20091219#p1</link>
	<description> プログラムでは整数の四則演算はよくよく注意しないと足をすくわれることがあります。 整数と呼んでるものが普通と違って範囲があって循環しているためです。最大値と最小値の絶対値が 1 ズレているのもいや〜な問題の元になります。 この 1 ズレのため除算で整数オーバーフ</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>プログラムでは整数の四則演算はよくよく注意しないと足をすくわれることがあります。</p>
			<p>整数と呼んでるものが普通と違って範囲があって循環しているためです。最大値と最小値の絶対値が 1 ズレているのもいや〜な問題の元になります。</p>
			<p>この 1 ズレのため除算で整数オーバーフローが発生します。除算でですよ。</p>
			<p>int の最小値を -1 で割ったときに結果が表現できないためです。除算と剰余ではただこの 1 ケースのみオーバーフローが起きます。</p>
			<p>このケースは仕様書にちゃんと書いてあります。仕様書によると checked では例外スロー。unchecked では「unchecked コンテキストでは、System.ArithmeticException (またはコンテキストでのサブクラス) がスローされるか、または左のオペランドを結果値としてオーバーフローを報告しないかは、実装で定義されます。」実装依存だそうです。では Visual Studio 2008 SP1 で試してみます。</p>
			<p>「int x = int.MinValue / -1;」と書くとコンパイルエラーになります。下のように書くとコンパイルは通ります。おバカさんめ。</p>
<pre class="syntax-highlight">
<span class="synType">static</span> <span class="synType">void</span> Test1()
{
    <span class="synType">int</span> m = <span class="synType">int</span>.MinValue;
    <span class="synType">int</span> n = m / -<span class="synConstant">1</span>; <span class="synComment">// OverflowException 発生</span>
    Console.WriteLine( n );
}
</pre>

			<p><span style="font-weight:bold;">実行すると unchecked なのに OverflowException が飛んできました。</span>x86/x64 Debug/Release ぜーんぶ全部です。checked も当然同じです。</p>
			<p>0 で割り算しようとしてしまうのは当然気を付けますが、-1 も実は注意が必要ということですね。</p>
			<br>

			<p>続いて剰余。こっちはクレイジーです。</p>
			<p>「int x = int.MinValue % -1;」と書くと x は<span style="font-weight:bold;">正常に 0 になります</span>。</p>
			<p>ところが</p>
<pre class="syntax-highlight">
<span class="synType">static</span> <span class="synType">void</span> Test2()
{
    <span class="synType">int</span> m = <span class="synType">int</span>.MinValue;
    <span class="synType">int</span> n = m % -<span class="synConstant">1</span>; <span class="synComment">// OverflowException 発生!!</span>
    Console.WriteLine( n );
}
</pre>

			<p><span style="font-weight:bold;">これを実行すると除算同様 OverflowException が飛んできます。</span>ひどい。コンパイル時と実行時で違うんですね。</p>
			<p>checked も x86/x64 Debug/Release 全部 OverflowException です。</p>
			<p>仕様書によると「左オペランドが int または long の最小値で右オペランドが -1 の場合は System.OverflowException がスローされます。x / y が例外をスローしない場合に x % y が例外をスローすることはありません。」だそうです。x / y が例外をスローするなら x % y が例外をスローする、とは書いてませんが MS のコンパイラはそういう動きをしました。これを書いてないのは高速化のために実装の幅を残すためでしょうね。</p>
			<p>そもそも 0 でいいのに。CPU では除算と剰余が一体なので、除算でオーバーフローが起きたら剰余もその結果に従うということのようです。x86 では CPU が例外を投げるようですが、x64 では 32bit 演算なのに結果は 64bit 幅なので、しょうがなく(?) JIT 後の機械語に int.MinValue % -1 かどうかチェックするコードが生成されていました。明らかにそうじゃない場合はチェックコードは生成されません。わざわざチェックコードを生成するなら x86 にチェックコードを加えて 0 を返せばよかったのに。</p>
			<p>まあ、マイナス割るマイナスって一体何だかわかりませんが、こんなことがあるので注意が必要ですよというお話でした。</p>
		</div>
]]></content:encoded>
	<dc:creator>siokoshou</dc:creator>
	<dc:date>2009-12-19</dc:date>
	<dc:subject>C#</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/siokoshou/20091119#p1">
	<title>[Silverlight] PDC09</title>
	<link>http://d.hatena.ne.jp/siokoshou/20091119#p1</link>
	<description> 仕事はえー！ http://www.publickey.jp/blog/09/internet_explorer_9html5directxsilverlight_4.html http://www.publickey.jp/blog/09/pdc09windows_azure.html Silverlight4 beta が出たようです。こっちもはえーｗ 3出たばっかりのような気がしてた… ついに右クリック解</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>仕事はえー！</p>
			<ul>
				<li><a href="http://www.publickey.jp/blog/09/internet_explorer_9html5directxsilverlight_4.html">http://www.publickey.jp/blog/09/internet_explorer_9html5directxsilverlight_4.html</a></li>
				<li><a href="http://www.publickey.jp/blog/09/pdc09windows_azure.html">http://www.publickey.jp/blog/09/pdc09windows_azure.html</a></li>
			</ul>
			<p>Silverlight4 beta が出たようです。こっちもはえーｗ 3出たばっかりのような気がしてた…</p>
			<p>ついに右クリック解禁らしい。</p>
		</div>
]]></content:encoded>
	<dc:creator>siokoshou</dc:creator>
	<dc:date>2009-11-19</dc:date>
	<dc:subject>Silverlight</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/siokoshou/20091117#p1">
	<title>[.NET] さよなら CAS</title>
	<link>http://d.hatena.ne.jp/siokoshou/20091117#p1</link>
	<description> http://www.infoq.com/jp/news/2009/11/CAS-Replaced CAS がなくなる件、InfoQ の記事になりましたね。 これってひょっとして unsafe の事実上の解禁になるのかな？よくわかってないですけど。 型安全はつまらないバグをかなり減らしてくれるんで、安易に unsafe に頼りたく</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p><a href="http://www.infoq.com/jp/news/2009/11/CAS-Replaced">http://www.infoq.com/jp/news/2009/11/CAS-Replaced</a></p>
			<p>CAS がなくなる件、InfoQ の記事になりましたね。</p>
			<p><del datetime="2009-11-17T17:13:44+09:00">これってひょっとして unsafe の事実上の解禁になるのかな？よくわかってないですけど。</p>
			<p>型安全はつまらないバグをかなり減らしてくれるんで、安易に unsafe に頼りたくないですが、これが解禁を意味するならうずうずしてしまう場面はありそうです(^^;</p>
			<p>解禁じゃなかったらごめんなさい。</del>記事の後半はよくわかりません…。</p>
		</div>
]]></content:encoded>
	<dc:creator>siokoshou</dc:creator>
	<dc:date>2009-11-17</dc:date>
	<dc:subject>.NET</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/siokoshou/20091115#p1">
	<title>[Go] goroutine を使ってみた</title>
	<link>http://d.hatena.ne.jp/siokoshou/20091115#p1</link>
	<description> Go 翻訳プロジェクトが立ち上がったようですね。チュートリアルのかなりの部分がもう訳されてます。 http://go.shibu.jp/ 遊んでるうちに、将来は C に取って代わりそうだなという気がしてきました。 昨日のコードの goroutine 版が動きました。まだ goroutine がどういうも</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>Go 翻訳プロジェクトが立ち上がったようですね。チュートリアルのかなりの部分がもう訳されてます。</p>
			<p><a href="http://go.shibu.jp/">http://go.shibu.jp/</a></p>
			<p>遊んでるうちに、将来は C に取って代わりそうだなという気がしてきました。</p>
			<p>昨日のコードの goroutine 版が動きました。まだ goroutine がどういうものかさっぱりわからないので、使い方が間違ってる可能性大ですが。</p>
			<p><del datetime="2009-11-15T17:18:06+09:00">ちょっと新人いじめがすぎました。遅いです。</del>いや、使い方が間違ってるほうが大きいかもしれないけど。</p>
			<p>(追記) うわさの runtime.GOMAXPROCS つけたらものすごく速くなった！使えるかもと思った。コードは差し替えておきます。</p>
			<p>4CPU割り当ててやってみたらむしろ遅くなったｗ みんな並列じゃ苦労してるんだねｗ</p>
			<p>以下、コード</p>
			<a name="seemore"></a>

<pre class="syntax-highlight">
<span class="synStatement">package</span> main

<span class="synStatement">import</span> (
	<span class="synConstant">&#34;math&#34;</span>;
	<span class="synConstant">&#34;fmt&#34;</span>;
	<span class="synConstant">&#34;os&#34;</span>;
	<span class="synConstant">&#34;runtime&#34;</span>;
	<span class="synConstant">&#34;container/vector&#34;</span>;
)

<span class="synStatement">const</span> (
	K	= <span class="synConstant">4</span>;
	N	= <span class="synConstant">2</span>;
)

<span class="synStatement">const</span> channelBufferNum = <span class="synConstant">2048</span>

<span class="synStatement">type</span> DeBruijnSeq <span class="synStatement">struct</span> {
	k, n, max	<span class="synType">int</span>;
	out		<span class="synType">chan</span> *vector.IntVector;	<span class="synComment">// for output</span>
	count		<span class="synType">chan</span> <span class="synType">int</span>;
}

<span class="synStatement">type</span> DeBruijnSeqResult <span class="synStatement">struct</span> {
	ch	<span class="synType">chan</span> *vector.IntVector;
	result	<span class="synType">chan</span> *vector.Vector;
}

<span class="synStatement">func</span> Init(k, n <span class="synType">int</span>) (d *DeBruijnSeq, result *DeBruijnSeqResult, ok <span class="synType">bool</span>) {
	<span class="synStatement">if</span> k &#60; <span class="synConstant">2</span> || <span class="synConstant">10</span> &#60; k {
		<span class="synStatement">return</span> <span class="synStatement">nil</span>, <span class="synStatement">nil</span>, <span class="synStatement">false</span>
	}
	<span class="synStatement">if</span> n &#60; <span class="synConstant">1</span> {
		<span class="synStatement">return</span> <span class="synStatement">nil</span>, <span class="synStatement">nil</span>, <span class="synStatement">false</span>
	}

	max := math.Pow(<span class="synType">float64</span>(k), <span class="synType">float64</span>(n));
	<span class="synStatement">if</span> <span class="synType">float64</span>(<span class="synConstant">0x7FFFFFFF</span>) &#60; max {
		<span class="synStatement">return</span> <span class="synStatement">nil</span>, <span class="synStatement">nil</span>, <span class="synStatement">false</span>
	}

	out, result := startOutputServer();
	count := <span class="synStatement">make</span>(<span class="synType">chan</span> <span class="synType">int</span>, channelBufferNum);
	<span class="synStatement">return</span> &#38;DeBruijnSeq{k, n, <span class="synType">int</span>(max), out, count}, result, <span class="synStatement">true</span>;
}

<span class="synStatement">func</span> (d *DeBruijnSeq) Search() {
	a := vector.NewIntVector(d.n);
	<span class="synStatement">for</span> i := <span class="synConstant">0</span>; i &#60; d.n; i++ {
		a.Set(i, <span class="synConstant">0</span>)
	}
	<span class="synStatement">go</span> d.searchCore(a);
}

<span class="synStatement">func</span> (d *DeBruijnSeq) searchCore(a *vector.IntVector) {
	<span class="synComment">// 重複判定</span>
	<span class="synStatement">if</span> !d.isUnique(a) {
		d.count &#60;- -<span class="synConstant">1</span>;
		<span class="synStatement">return</span>;
	}

	<span class="synComment">// 完成判定</span>
	<span class="synStatement">if</span> d.isComplete(a) {
		<span class="synComment">//fmt.Println( &#34; comp! &#34; );</span>
		d.out &#60;- a;
		d.count &#60;- -<span class="synConstant">1</span>;
		<span class="synStatement">return</span>;
	}

	<span class="synComment">// 次の反復へ</span>
	<span class="synStatement">for</span> i := <span class="synConstant">0</span>; i &#60; d.k; i++ {
		d.count &#60;- <span class="synConstant">1</span>;
		b := vector.NewIntVector(<span class="synConstant">0</span>);
		b.AppendVector(a);	<span class="synComment">// copy</span>
		b.Push(i);
		<span class="synStatement">go</span> d.searchCore(b);
	}
	d.count &#60;- -<span class="synConstant">1</span>;
}

<span class="synStatement">func</span> (d *DeBruijnSeq) isUnique(a *vector.IntVector) <span class="synType">bool</span> {
	<span class="synStatement">if</span> a.Vector.Len() &#60;= d.n {
		<span class="synStatement">return</span> <span class="synStatement">true</span>
	}

	pos := a.Vector.Len() - d.n;

	<span class="synStatement">for</span> i := <span class="synConstant">0</span>; i &#60; pos; i++ {
		<span class="synStatement">if</span> sequenceEqual(a, i, pos, d.n) {
			<span class="synStatement">return</span> <span class="synStatement">false</span>
		}
	}
	<span class="synStatement">return</span> <span class="synStatement">true</span>;
}

<span class="synStatement">func</span> sequenceEqual(v *vector.IntVector, a, b, <span class="synStatement">len</span> <span class="synType">int</span>) <span class="synType">bool</span> {
	<span class="synStatement">for</span> i := <span class="synConstant">0</span>; i &#60; <span class="synStatement">len</span>; i++ {
		<span class="synStatement">if</span> v.At(a) != v.At(b) {
			<span class="synStatement">return</span> <span class="synStatement">false</span>
		}
		a++;
		b++;
	}
	<span class="synStatement">return</span> <span class="synStatement">true</span>;
}

<span class="synStatement">func</span> (d *DeBruijnSeq) isComplete(a *vector.IntVector) <span class="synType">bool</span> {
	<span class="synStatement">if</span> a.Vector.Len() != d.max {
		<span class="synStatement">return</span> <span class="synStatement">false</span>
	}

	b := vector.NewIntVector(<span class="synConstant">0</span>);
	b.AppendVector(a);	<span class="synComment">// copy</span>

	<span class="synStatement">for</span> i := <span class="synConstant">0</span>; i &#60; d.n-<span class="synConstant">1</span>; i++ {
		b.Push(b.At(i));
		<span class="synStatement">if</span> !d.isUnique(b) {
			<span class="synStatement">return</span> <span class="synStatement">false</span>
		}
	}
	<span class="synStatement">return</span> <span class="synStatement">true</span>;
}

<span class="synStatement">func</span> startOutputServer() (<span class="synType">chan</span> *vector.IntVector, *DeBruijnSeqResult) {
	out := <span class="synStatement">make</span>(<span class="synType">chan</span> *vector.IntVector, channelBufferNum);
	result := <span class="synStatement">make</span>(<span class="synType">chan</span> *vector.Vector, <span class="synConstant">2</span>);
	<span class="synStatement">go</span> output(out, result);
	<span class="synStatement">return</span> out, &#38;DeBruijnSeqResult{out, result};
}

<span class="synStatement">func</span> output(in <span class="synType">chan</span> *vector.IntVector, out <span class="synType">chan</span> *vector.Vector) {
	v := vector.New(<span class="synConstant">0</span>);
	<span class="synStatement">for</span> !<span class="synStatement">closed</span>(in) {
		<span class="synStatement">if</span> data := &#60;-<span class="synError"> </span>in; data != <span class="synStatement">nil</span> {
			<span class="synComment">//fmt.Println( data );</span>
			v.Push(data);
		}
	}
	out &#60;- v;
}

<span class="synStatement">func</span> main() {
	runtime.GOMAXPROCS(<span class="synConstant">2</span>);

	d, result, ok := Init(K, N);
	<span class="synStatement">if</span> !ok {
		os.Exit(<span class="synConstant">1</span>)
	}

	d.Search();
	<span class="synStatement">for</span> numOfGor := <span class="synConstant">1</span>; numOfGor != <span class="synConstant">0</span>; {
		numOfGor += &#60;-d.count
	}
	<span class="synStatement">close</span>(result.ch);
	n := &#60;-result.result;

	fmt.Println(n.Len());
}
</pre>

		</div>
]]></content:encoded>
	<dc:creator>siokoshou</dc:creator>
	<dc:date>2009-11-15</dc:date>
	<dc:subject>Go</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/siokoshou/20091115#p2">
	<title>[Go] C の弱点 default のスペルミスを継承していた</title>
	<link>http://d.hatena.ne.jp/siokoshou/20091115#p2</link>
	<description> no more creat。 package main import &#34;fmt&#34; func main() { a := 4; switch a { case 0, 1, 2: fmt.Println( a ); case 3: fmt.Println( &#34;いっぱい&#34; ); defuuuuult: fmt.Println( &#34;defuuuuuuult&#34; ); /&#42; default: fmt.Println( &#34;default&amp;#34</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>no more creat。</p>
<pre>
package main
import &#34;fmt&#34;

func main() {
	a := 4;

	switch a {
	case 0, 1, 2:
		fmt.Println( a );
	case 3:
		fmt.Println( &#34;いっぱい&#34; );
	defuuuuult:
		fmt.Println( &#34;defuuuuuuult&#34; );
/&#42;
	default:
		fmt.Println( &#34;default&#34; );
&#42;/
	}
}
</pre>

			<p>何も表示されません。</p>
			<p>文法見ると禁止されてるっぽいのに、穴がありますね。「defuuuuult:」は前の「case 3:」に続く StatementList 中のラベルになってるのかも。</p>
			<p>「$ hg log」したらこんなのが。やられたｗ</p>
<pre>
changeset:   3956:4a3f6bbb5f0c
user:        Ken Thompson &#60;xxx&#62;
date:        Tue Nov 10 15:05:15 2009 -0800
summary:     spell it with an "e"
</pre>
			<p>$ hg log -r3956 -p</p>
<pre>
+	O_CREATE	= O_CREAT;		// create a new file if none exists.
</pre>

		</div>
]]></content:encoded>
	<dc:creator>siokoshou</dc:creator>
	<dc:date>2009-11-15</dc:date>
	<dc:subject>Go</dc:subject>
</item>
<item rdf:about="http://d.hatena.ne.jp/siokoshou/20091114#p1">
	<title>[Go] Go でバックトラックを書いてみた</title>
	<link>http://d.hatena.ne.jp/siokoshou/20091114#p1</link>
	<description> Go language に De Bruijn sequence を列挙するコードを移植してみました。C# で書いたときのコードは こ ち ら。 goroutine を使って並列化したいんですが、まだデッドロックしてうまくいってませんｗ なのでとりあえずできたシーケンシャル版。ちなみに効率的に列挙するコ</description>

	<content:encoded><![CDATA[
		<div class="section">
			<p>Go language に De Bruijn sequence を列挙するコードを移植してみました。C# で書いたときのコードは <a href="http://d.hatena.ne.jp/siokoshou/20090715">こ</a> <a href="http://d.hatena.ne.jp/siokoshou/20090721">ち</a> <a href="http://d.hatena.ne.jp/siokoshou/20090722">ら</a>。</p>
			<p>goroutine を使って並列化したいんですが、まだデッドロックしてうまくいってませんｗ なのでとりあえずできたシーケンシャル版。ちなみに効率的に列挙するコードじゃなく、いじめ試験みたいなものです。</p>
			<p>De Bruijn の読みがずっと謎だったんですが、<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320026683/siokoshoutech-22/ref=nosim/">コンピュータの数学</a>という本では「ドブリューイン」としてました。O記法の数学のあたりにちらっと名前が出てきました。</p>
			<p>Go は関数から多値で返す文法がきれいでいいですね。C# の out はやってることは正しいのに、汚い文法なのが悲しい。レシーバーとインターフェイスでも遊んでみたいな。Go を最初に見たときは古臭い文法だと思ったけど、調べているといろいろと今どきっぽい機能をちゃんと持ってたりします。まーまだわからないことだらけですが。</p>
<pre class="syntax-highlight">
<span class="synStatement">package</span> main

<span class="synStatement">import</span> (
    <span class="synConstant">&#34;math&#34;</span>;
    <span class="synConstant">&#34;fmt&#34;</span>;
    <span class="synConstant">&#34;os&#34;</span>;
    <span class="synConstant">&#34;container/vector&#34;</span>;
)

<span class="synStatement">type</span> DeBruijnSeq <span class="synStatement">struct</span> {
    k, n, max <span class="synType">int</span>;
    results *vector.Vector;
}

<span class="synStatement">func</span> Init( k, n <span class="synType">int</span> ) ( d *DeBruijnSeq, ok <span class="synType">bool</span> ) {
    <span class="synStatement">if</span> k &#60; <span class="synConstant">2</span> || <span class="synConstant">10</span> &#60; k { <span class="synStatement">return</span> <span class="synStatement">nil</span>, <span class="synStatement">false</span> }
    <span class="synStatement">if</span> n &#60; <span class="synConstant">1</span> { <span class="synStatement">return</span> <span class="synStatement">nil</span>, <span class="synStatement">false</span> }

    pow := math.Pow( <span class="synType">float64</span>( k ), <span class="synType">float64</span>( n ) );
    <span class="synStatement">if</span> <span class="synType">float64</span>( <span class="synConstant">0x7FFFFFFF</span> ) &#60; pow { <span class="synStatement">return</span> <span class="synStatement">nil</span>, <span class="synStatement">false</span> }
    max := <span class="synType">int</span>( pow );

    r := vector.New( <span class="synConstant">0</span> );
    <span class="synStatement">return</span> &#38;DeBruijnSeq{ k, n, max, r }, <span class="synStatement">true</span>
}

<span class="synStatement">func</span> ( d *DeBruijnSeq ) Search() {
    a := vector.NewIntVector( d.n );
    <span class="synStatement">for</span> i := <span class="synConstant">0</span>; i &#60; d.n; i++ { a.Set( i, <span class="synConstant">0</span> ) }
    d.searchCore( a );
}

<span class="synStatement">func</span> ( d *DeBruijnSeq ) searchCore( a *vector.IntVector ) {
    <span class="synComment">// 重複判定</span>
    <span class="synStatement">if</span> !d.isUnique( a ) { <span class="synStatement">return</span> }

    <span class="synComment">// 完成判定</span>
    <span class="synStatement">if</span> d.isComplete( a ) {
        d.output2( a );
        <span class="synStatement">return</span>
    }

    <span class="synComment">// 次の反復へ</span>
    <span class="synStatement">for</span> i := <span class="synConstant">0</span>; i &#60; d.k; i++ {
        b := vector.NewIntVector( <span class="synConstant">0</span> );
        b.AppendVector( a );  <span class="synComment">// copy</span>
        b.Push( i );
        d.searchCore( b );
    }
}

<span class="synStatement">func</span> ( d *DeBruijnSeq ) isUnique( a *vector.IntVector ) <span class="synType">bool</span> {
    <span class="synStatement">if</span> a.Vector.Len() &#60;= d.n { <span class="synStatement">return</span> <span class="synStatement">true</span> }

    pos := a.Vector.Len() - d.n;

    <span class="synStatement">for</span> i := <span class="synConstant">0</span>; i &#60; pos; i++ {
        <span class="synStatement">if</span> sequenceEqual( a, i, pos, d.n ) { <span class="synStatement">return</span> <span class="synStatement">false</span> }
    }
    <span class="synStatement">return</span> <span class="synStatement">true</span>
}

<span class="synStatement">func</span> sequenceEqual( v *vector.IntVector, a, b, <span class="synStatement">len</span> <span class="synType">int</span> ) <span class="synType">bool</span> {
    <span class="synStatement">for</span> i := <span class="synConstant">0</span>; i &#60; <span class="synStatement">len</span>; i++ {
        <span class="synStatement">if</span> v.At( a ) != v.At( b ) { <span class="synStatement">return</span> <span class="synStatement">false</span> }
        a++; b++;
    }
    <span class="synStatement">return</span> <span class="synStatement">true</span>
}

<span class="synStatement">func</span> ( d *DeBruijnSeq ) isComplete( a *vector.IntVector ) <span class="synType">bool</span> {
    <span class="synStatement">if</span> a.Vector.Len() != d.max { <span class="synStatement">return</span> <span class="synStatement">false</span> }

    b := vector.NewIntVector( <span class="synConstant">0</span> );
    b.AppendVector( a );  <span class="synComment">// copy</span>

    <span class="synStatement">for</span> i := <span class="synConstant">0</span>; i &#60; d.n - <span class="synConstant">1</span>; i++ {
        b.Push( b.At( i ) );
        <span class="synStatement">if</span> !d.isUnique( b ) { <span class="synStatement">return</span> <span class="synStatement">false</span> }
    }
    <span class="synStatement">return</span> <span class="synStatement">true</span>
}

<span class="synStatement">func</span> ( d *DeBruijnSeq ) output2( a *vector.IntVector ) {
    d.results.Push( a )
}

<span class="synStatement">func</span> main() {
    d, ok := Init( <span class="synConstant">4</span>, <span class="synConstant">2</span> );
    <span class="synStatement">if</span> !ok { os.Exit( <span class="synConstant">1</span> ); }

    d.Search();

    fmt.Println( d.results.Len() );

    <span class="synStatement">if</span> <span class="synStatement">len</span> := d.results.Len(); <span class="synStatement">len</span> &#60; <span class="synConstant">10</span> {
        <span class="synStatement">for</span> i := <span class="synConstant">0</span>; i &#60; <span class="synStatement">len</span>; i++ {
            fmt.Println( d.results.At(i) )
        }
    }
}
</pre>

			<p>VMware Player 上の x86 な Ubuntu に 2CPU 割り当てて実行したんですが、結構速いかも。</p>
		</div>
]]></content:encoded>
	<dc:creator>siokoshou</dc:creator>
	<dc:date>2009-11-14</dc:date>
	<dc:subject>Go</dc:subject>
</item>
</rdf:RDF>
