北京でサウナに行ってきた

 


どうも。自分は今仕事で北京に出張きています。

大気汚染に苦しみながらの労働でストレスフルな生活を送っています。。

ということでサウナーな私の週末は、サウナに行くしか選択肢がなく、まとめてみます。

 

行ったサウナはこちら!
汤悦温泉汗蒸生活馆 (天鹅湾店)
(脳内で勝手に、ゆえつ温泉あせむし館と読んでいます。)

 

こちらで詳しく紹介されていたので、安心感がありました。

ai-china.hatenablog.com

 

24時間営業だったので24:30くらいに行ってみたのですが、今(2022/08/21)は外国人は2:00には退館しないといけないらしく、翌日22時頃にリベンジしました。

遅い時間だったこともあり、あまり混んでいなかったです。全体的に若い人(20~40代)が多かったです。

 

入館時して早速シャワーへ、普通に良いです。
シャワーとは別に洗面台があって、そこで歯を磨けるようになっています。(中国で初めて蛇口の水を口に含みましたが、特に嫌な気はしなかったです)

浴場は42度(3人程)、40度(10人程)、37度(4人程)で普通によかったです。
水風呂(1人用)はサウナ室の中にあります。

 

ではいざ、サウナへ。

まず、床がぬるぬるする。。
まぁ中国ですし目を瞑ります、移動するときは少し気をつけます。

温度は60度くらいで、湿度はそこそこありました。
ボタンを押すとロウリュが発射される仕組みです。

収容人数は6人程度。
サウナストーブ横上段2人、その他下段3人、水風呂前に1人。

サウナ室に立っている人がいました。立って体に汗を塗り込んでいます。。

どうやら中国では汗をかいてもそれは美容に良いもの捉えて流さない文化があるようで、ああ化粧水を塗り込んでいるんだ、、と納得。

hongkongshenzhen.seesaa.net

 

座っていると、途中からもう一人立ち上がるってじっとしています。
やっぱり立ちスタイルは結構普通にいて、そういうもんなんだなーと思いました。

あとみんな全然出るのが早かったです。
60度だったので、自分は15分程度いるんですが、みんな5分程度で出ていっちゃいます笑

しかも、サウナ内の水風呂には入らないのです。皆、水風呂はタオルをやメガネを洗うだけで、私が水風呂に入ると、「あ、こいつ入るんだ」みたいな視線を浴びます。

なんとか滞在中にこの辺の考え方を究明したいと思います笑

水風呂は15度くらいで温度は丁度良いのですが、匂いがちょっと変でした。。
なんか。。ちょっと水槽の匂い的なものを感じたのですが、中国ですし目を瞑ります。

出ても休憩スペースがないので、お風呂の淵で座って休憩します。

しっかり整えました。

適当にお湯に浸かった後、2セット目。
タオルをお尻に敷いてる人がいました。(もしこれを読んで行ってみる方は、敷く用のタオルを取ってサウナに向かうと良いと思います)

粛々とこなして、水風呂→休憩。
ただ、休憩スペースがなくて少し居心地が悪いので、早めに切り上げました。

 

どうやら、この施設はスーパー銭湯的な休憩スペースが充実しているのでぐるっと回ってみました。

色々売っていたので、飲み物を購入。

 

謎の映像が流れる床があって、こういうの好きなのでしばらく遊んでました。

また、この廊下の奥に岩盤浴もあったので、1日で遊び尽くせないなと思いました。

 

中国サウナ、まだまだ未知な部分が多いので、また別の場所に挑戦して発見を積み重ねようと思います。

Flatter(dart)の非同期処理、(async/await)の挙動を確かめる

Flutterっていうかdartの同期処理がよくわからなくなったんで、思いつくパターンを書いてみて、挙動を把握し、金輪際、同期処理での失敗とはおさらばします!

処理に時間がかかる関数を使う時、作った時の扱い方の参考になると思います。

 

今回挙動を試す関数は以下の4通りです。

void f1() {
// 遅れて処理だけするfutureインスタンスを返さない
Future.delayed(Duration(seconds: 1), () {
print("f1");
});
}

void f2() {
// 遅れてStringを返してくれるfutureインスタンスを返さない
Future.delayed(Duration(seconds: 1), () {
return "f2";
});
}

Future<void> f3() {
// 遅れて処理だけするfutureインスタンスを返す
return Future.delayed(Duration(seconds: 1), () {
print("f3");
});
}

Future<String> f4() {
// 遅れてStringを返してくれるfutureインスタンスを返す
return Future.delayed(Duration(seconds: 1), () {
return "f4";
});
}

それぞれasync/awaitを付ける/付けないの2通りで試すので、計8通りの結果が正しく予測できたらこの記事は読まなくて大丈夫です笑

(そもそもflutterの同期処理はfuture/thenでも書けますが、ネストが深くなっちゃうのでawait/asyncを使う方が良いらしいので、こちらで書きます) 

 

f1・・・遅れて処理だけする関数で、値を返さない関数です。

void f1() {
// 遅れて処理だけするfutureインスタンスを返さない
Future.delayed(Duration(seconds: 1), () {
print("f1");
});
}

await 実行関数 結果

awaitなし

同期的)

main() {
  print("start");
  f1();
  print("end");
}
start
end
f1

awaitあり

(非同期)

Future<void> main() async {
  print("start");
  await f1();
  print("end");
}
start
end
f1


実行側でasync/awaitを付けようが付けまいが、処理は待ってもらえません。

 

 f2・・・遅れてStringを返してくれるfutureインスタンスを返さない。

void f2() {
// 遅れてStringを返してくれるfutureインスタンスを返さない
Future.delayed(Duration(seconds: 1), () {
return "f2";
});
}

await 実行関数 結果

awaitなし

(同期的)

main() {
  print("start");
  f2();
  print("end");
}
start
end

await

(非同期)

Future<void> main() async {
  print("start");
  await f2();
  print("end");
}
start
end

 

mainからすると値を返して来ないし、処理もしてないので無意味な呼び出しとなります。

 

f3・・・遅れて処理だけするfutureインスタンスを返す

Future<void> f3() {
// 遅れて処理だけするfutureインスタンスを返す
return Future.delayed(Duration(seconds: 1), () {
print("f3");
});
}

await 実行関数 結果

awaitなし

(同期的)

main() {
  print("start");
  f3();
  print("end");
}
start
end
f3

awaitあり

(非同期)

Future<void> main() async {
  print("start");
  await f3();
  print("end");
}
start
f3
end

 

futureインスタンスが返って来る時に、mainでasync/awaitをつけるとそのfutureインスタンスの処理が完了するのを待ってからmainの以降の処理に取り掛かります。

 

f4・・・遅れてStringを返してくれるfutureインスタンスを返す

Future<String> f4() {
// 遅れてStringを返してくれるfutureインスタンスを返す
return Future.delayed(Duration(seconds: 1), () {
return "f4";
});
}

await 実行関数 結果

awaitなし

(同期的)

main() {
  print("start");
  var hoge = f4();
  print(hoge);
  print("end");
}
start
Instance of 'Future<String>'
end

awaitあり

(非同期)

Future<void> main() async {
  print("start");
  var hoge = await f4();
  print(hoge);
  print("end");
}
start
f4
end

async/awaitをしないと、f4の処理の時間を待たず、インスタンスそのものが出力されます。async/awaitすると、futureインスタンスの処理を待ち、返り値を取得してから後続の処理へ続いてくれます。

 

以上がasync/awaitの処理の挙動結果となります。二度とこの辺の処理で悩まないようになれたらいいですね、、、!!

 

 

 

 

Flutterのlocationライブラリを使って現在地機能を追加する

どうも、前回作った天気予報アプリに、現在地の天気を取得する機能を追加します。

Flutterで天気予報アプリを作る - かれきゃぶろぐ

さくっと設計します。

f:id:castlejou:20200926180116p:plain

 

さくっと実装していきます。

 

どうやら位置情報を取得する(主要な)ライブラリは2種類あるらしく、

geolocator | Flutter Package

location | Flutter Package

それぞれにしかできない機能は、ざっくり以下のとおりです。

  • geolocator は取得する最後に取得した位置情報といったちょっとリッチなAPIが使える
  • locationにはそういったAPIはなさそうだが、前者では無理っぽいweb対応もしてる

前者の機能は最悪自分で書ける気がしますが、後者の機能はめんどくさそうなので今回は後者を使うことにしました。

使い方です。まず普通にpubspec.ymlに追加し、Pub getします。

dependencies:
location: ^3.0.2

Androidは特に何も設定しないで取得できるらしい

Android
With Flutter 1.12, all the dependencies are automatically added to your project. If your project was created before Flutter 1.12, you may need to follow this.

iOSios/Runner/Info.plistに項目二つ追加するらしい。

iOS
And to use it in iOS, you have to add this permission in Info.plist :

NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription

qiita.com

を参考にさせてもらい、ios/Runner/Info.plistに4行追記。

 <key>NSLocationAlwaysUsageDescription</key>             // 追加
<string>Your location is required for this app</string> // 追加
<key>NSLocationWhenInUseUsageDescription</key>          // 追加
<string>Your location is required for this app</string> // 追加

これで準備完了。

 

位置情報を取得するlocation.getLocation関数を呼ぶ前には、スマホの位置情報がオンになっているか、アプリが位置情報にアクセスできるか、の2点を確認する。

Future<bool> checkLocation() async {
Location location = new Location();
bool _serviceEnabled;
PermissionStatus _permissionGranted;

_serviceEnabled = await location.serviceEnabled();
if (!_serviceEnabled) {
_serviceEnabled = await location.requestService();
if (!_serviceEnabled) {
return false;
}
}
_permissionGranted = await location.hasPermission();
if (_permissionGranted == PermissionStatus.denied) {
_permissionGranted = await location.requestPermission();
if (_permissionGranted != PermissionStatus.granted) {
return false;
}
}
return true;
}

チェックするのは、地域設定画面で現在位置ボタンを押下した時(1)と、現在位置設定後、アプリを再度起動した時にデフォルトの設定が現在位置になっている時(2)の2カ所で良さそう。

  • (1)の場合で、位置情報が取得できなかった場合、選択地域は変更せず、地域設定画面に止まる。
  • (2)の場合で、位置情報が取得できなかった場合、とりあえず東京にして天気を返す。

というロジックにします。

 

では、まず選択肢を追加します。

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("地域設定"),
),
body: ListView.builder(
itemBuilder: (BuildContext context, int index) {
if (index == 0) {
return _areaItem(context,
AreaEntity(area: CurrentLocation.area, lon: null, lat: null));
} else {
return _areaItem(context, areas[index - 1]);
}
},
itemCount: 48,
));
}

あんまりよくない気しかしないですが、ListView.builderでindexが0の時を現在位置とし、itemCount を勝手に+1しちゃいます。

 _areaItemはこんな感じ。

Widget _areaItem(BuildContext context, AreaEntity area) {
final areaModel = Provider.of<AreaModel>(context, listen: true);
return GestureDetector(
child: Container(
padding: EdgeInsets.all(8.0),
decoration: new BoxDecoration(
border: new Border(
bottom: BorderSide(width: 1.0, color: Colors.grey))),
child: Row(
children: <Widget>[
Container(
margin: EdgeInsets.all(10.0),
child: area.area == areaModel.areaEntity.area
? Icon(Icons.check)
: Icon(null),
),
Text(
area.area ?? "",
),
],
)),
onTap: () async {
bool isPop = true;
if (area.area == CurrentLocation.area) {
bool isGetLocation = await areaModel.checkLocation();
if (!isGetLocation) isPop = false;
}
if (isPop) {
areaModel.update(area);
Navigator.pop(context);
} else {
showDialog(
context: context,
builder: (_) => AlertDialog(
title: Text("位置情報エラー"),
content: Text("設定から位置情報の取得を許可してください"),
actions: <Widget>[
FlatButton(
child: Text("OK"),
onPressed: () => Navigator.pop(context),
),
],
));
}
},
);
}

CurrentLocationというクラスを作り、areaを比較することでタップされた項目が現在位置か否かを調べてます。

class CurrentLocation {
// 二回目以降の起動フラグ
static const String area = '現在位置';
}

権限を確かめ、もし権限に不備があればisPopがfalseになり、AlertDialogが表示されることになります。情報取得できる場合はupdateで情報更新します。

Future<bool> update(AreaEntity areaEntity) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
if (areaEntity.area == CurrentLocation.area) {
List<String> loc = await getLocation();
areaEntity.lon = loc[0];
areaEntity.lat = loc[1];
}
prefs.setString(SharedPreferencesKeys.areaEntity, json.encode(areaEntity));
_areaEntity = areaEntity;
_weatherEntity = await getWeather();
notifyListeners();
}
Future<List<String>> getLocation() async {
Location location = new Location();
LocationData _locationData = await location.getLocation();
return [
_locationData.longitude.toString(),
_locationData.latitude.toString()
];
}

これで、現在位置を取得できるようになりました!

動作はこんな感じです。

 

 

コードは次のリポジトリに置いています!

github.com

Flutterでopenweathermapを使って天気予報アプリを作る

お久しぶりです。

とにかくアウトプットしようと思い、なけなしの休みでさくっとFlutterで天気予報アプリを作成してみました。

 

何を作るめて(要件定義)、どうやって作るか決めて(設計)、ちゃんと作る(実装)っていう感じで進めます。正直、設計と実装を一緒にやっちゃう方が楽なので厳密にタスクを分けたりしないですが、、

要件

開いたら、無駄なアクションが一切なく一瞬で今日の天気を確認できるアプリを作る。

 

設計

一旦、画面仕様書はこんな感じに作りました。

f:id:castlejou:20200919131137p:plain

アイコンとAPIは用意しないといけないです。

前準備〜アイコン〜

アイコンはLottieFilesっていういい感じのアニメーションを使用しました。これは様々な(Lottie libraries and plugins available for Web, iOS, Android, Flutter, React, React Native, Xamarin, NativeScript, Windows, Vue, Angular, QT, Skia, Framer X, Sketch, Figma & After Effects.)環境で動かせる、jsonだけでアニメーションを実現できます。

それっぽいアニメーションを探して、jsonファイルを取得し、アプリからライブラリ呼び出すだけで使えます。

f:id:castlejou:20200922184803p:plain

f:id:castlejou:20200922185819p:plain

前準備〜APIの準備(OpenWeatherMap)〜

APIは、OpenWeatherMapの無料枠を利用します。

f:id:castlejou:20200919133725p:plain

APIを利用するには登録が必要なので、ここ https://home.openweathermap.org/users/sign_up から登録します。

API仕様は https://openweathermap.org/current ここにあり、都市名、都市ID、緯度経度、ZIPコード(郵便番号の米国版・・・ZIPコード - Wikipedia)をキーに特定の都市の天気を取得できるようです。

プルダウンで選択する47都道府県の情報からAPIを叩く必要があり、OpenWeatherMapで使える英語表記都市名やzip codeの情報に変換するの結構めんどくさそう、、と思ってましたが、緯度経度でのAPI叩いと時もレスポンス早かったので、緯度経度をリクエストパラメータに使います。

http://tancro.e-central.tv/grandmaster/maps/capitalTable.html こういうサイトで、県庁所在地と緯度経度情報の対応表をゲットして、矩形選択でいい感じのjsonに整形します。

 

f:id:castlejou:20200919140516p:plain f:id:castlejou:20200922184511p:plain

 

実装準備

とりあえずデータはそろったので、flutterの新規プロジェクトを作ります。

jsonフォルダ下に作成した都道府県⇄緯度経度対応ファイルと、Lottieから取得したjsonを置いておきます。

f:id:castlejou:20200922185910p:plain

*pubspec.yamlに配置したファイルを読み込ませるように設定しておきます。

flutter:
assets:
- json/

 

実装

はい、すんません。早速画面の追加です。プルダウンで想定していましたが、やっぱり画面遷移して地域を選択させましょう。(これ仕事だと怒られるやつ、、)

f:id:castlejou:20200919170230p:plain

 

今回はProviderで一旦実装しますので、↓のリンクを参考にしました。

qiita.comitome.team

note.com

 本当はstate_notifierとやらがいい感じらしいですが、、いったんね、、

qiita.com

 

で、なんやかんや苦戦しながら作ります。

ディレクトリ構成はこんな感じです。一つ目のリンク(Flutterのpackage:providerを使ったBloc的アーキテクチャ全体像をサンプルで理解するまとめ - Qiita)を参考しています。

f:id:castlejou:20200922190134p:plain



コードは以下のリポジトリに配置していますので、興味のある方はみてみてください。(レビューして欲しい、、)

github.com

 (コードの解説もしたかったんですが長くなるので、書くとしてもモジュールごとに分解して今度書きます笑)

 

動作はこんな感じです

 

 

LeapMotionで簡単な動的生体認証してみた(JavaのOpenGL(JOGL)で)

今回はJavaOpenGL(JOGL)でLeapMotion使って簡単な生体認証アプリを作ってみました。のでやってみたいと思います。環境はwindows8.1、Eclipseです。

まずEclipseにライブラリを設定します。

JavaOpenGLライブラリは以下のサイトを見て下さい。

JOGL,JOCLのEclipse環境を整える - プログラムdeタマゴ

そしてLeapMotionはこちらのサイトです。ビルドパス通してサンプルを実行してくれてます。

LeapMotionのサンプルプログラムで遊んだ - あんまり見ないでください

あと僕の作ったプログラムはJAMAを使うのでこちらも一応。

Java行列ライブラリ(JAMA)を使ってみた | Always Look at the Bright Side of Life

Javaプロジェクトを新規作成して、LeapGLというクラスを作ってください。そして上記のライブラリのビルドパスを通すとこんな感じです。(C:にjavapathファイルを作ってそこにまとめてます)

f:id:castlejou:20160119013340j:plain

こちらが作ってみたコードです。適当にコピペしてください。

github.com

LeapGLを実行してLeapMotionに手をかざすとこんな感じで動くと思います。

f:id:castlejou:20160119011016j:plain

LeapMotionから以下の関節の座標をマイフレーム取得してプロットしています。このデータを色々処理すると遊びがいがありそうですね。

f:id:castlejou:20160119013053p:plain

てことで生体認証()なシステムを作ってみました。それがLeapKeyてプログラムです。汚いコードなのであまり見ないでください。実行の様子と状態遷移図です。

f:id:castlejou:20160119013008j:plain

f:id:castlejou:20160119013137j:plain

 実行してる様子を動画にしてみました。

youtu.be

 

ちなみにLeapMotionのUSBケーブルってUSB3.0 micro Bて種類で、これはAndroidの充電ケーブルの規格USB2.0 micro Bでも認識するのです。持ち運ぶとき純正のケーブルいらなくて済むかもですね。動作は保証しませんけどw

f:id:castlejou:20160119020058j:plain

 すみませんこの記事作るのしんどくて説明不足だと思いますが、もし詳しく使い方を見たければGithubにhowtouse.pdf上げてるので読んでみてください。

 

コンパイラ型、インタプリタ型、中間コード型の違い

プログラミング言語の分類

プログラムを実行するにはプログラムを機械語に変換する必要がある。その変換して実行する形式にはインタプリタ型とコンパイラ型と中間コード型の3種類がある。

  1. コンパイラ型 プログラム全体を一括して機械語に変換し、単独のソフトにする。○○(C言語など)コンパイラといえば○○言語で書かれたプログラムを実行形式のプログラムに変換するソフトウェアの事(→☆)。デバッガと呼ばれるソフトで動作を時々止めながらバグを取り除く(デバッグ)必要がある。
  2. インタプリタ型 インタプリタというソフトウェアがプログラムを読み込み一行ずつ直ちに機械語の命令にして実行してくれる。なのでプログラムの一部であっても実行することが出来る。ちなみにインタプリタ型のプログラミング言語は実行や記述を比較的簡単に行うことが出来るのでスクリプト言語とも呼ばれることが多くある。但しスクリプト言語の定義はややこしいので深入りしない。
  3. 中間コード型 インタプリタ型とコンパイラ型との中間。まずプログラムはコンパイルされます。しかしここで一挙に機械語に変換はせず、中間コードという非高級(人が読めない)で非機械語の(低級?)コードに変換されファイルに保存される。このファイルを仮想機械(バーチャルマシン)というインタプリタインタプリタ型のように実行してくれる。(中間コードと連呼したがJavaではこれをバイトコードと呼ぶ)

(→☆)の部分(静的/動的リンカ)

厳密にいうとコンパイラ機械語の命令の束にするまでのソフトウェアで、その結果をファイルにしても必ずしもアプリケーションになるとは限らない。コンパイル時にプログラムの中では、自分の中だけでは内容がわからない(未定義)関数と分かる(定義済み)関数とに分け継ぎ目みたいな記号を書き込む、という作業を行っています。未定義関数ってのはライブラリの関数ことです。そのあとリンカというソフトウェアが未定義部分をライブラリのファイルから必要なところを持ってきて継ぎ目を結びつけます。リンカには静的リンカ動的リンカとの2種類があり、静的リンカは上で述べた作業を普通に行い、動的リンカでは継ぎ目状態でとりあえず実行ファイルを書き出し、必要になったとき(実行されたとき)に継ぎ目を調べて結びつける。動的で参照先となる機能がまとめられたファイルをDLL(Dynamic Linc Library)と呼ぶ。実行ファイルごとにライブラリをリンクしないことによって同じ機能を何回もリンクする必要がなくなる。

 

http://cdn38.atwikiimg.com/hiropknot/?plugin=ref&serial=6

hiropknot @ ウィキ - 共有ライブラリの管理

 

コンパイラ言語とインタープリタ言語

コンパイラとインタプリタ

http://www.geocities.jp/naosacra/mops/forbeginner/2.html

色々参照させてもらい、書きました。間違ってるところがあったら教えてください。

量子アルゴリズム、ドイチのアルゴリズム

この前の続きです。

今回は制御の様子とアルゴリズム的な話です。
ドイチ・ジョザアルゴリズム(Deutsch-Jozsa algorithm)を1ビットで考えるドイチュのアルゴリズムです。入力 x = {0, 1} に対する関数 f(x) の出力が x に依存するか依存しないかを、関数への問い合わせ回数一回で確かめることが出来ます。
f:id:castlejou:20151113231436j:plain
簡単に言うと、この f(x) の表の4タイプのうち、青いタイプか赤いタイプかが f(x)を一度確かめるだけで分かりますよーってこと。


前回の話では磁場をかけることでスピンを制御することが出来るとこまで行きました。その磁場のかけ方(時間や強度)を調整することで、量子コンピュータで必要な演算(例えば状態|0>を重ね合わせ状態|0>+|1>に変換する演算とか)を実行できます。そういった演算子と処理の流れを電気回路に置き換えて表現できます。

先にドイチのアルゴリズム全体の量子ゲートを見てみましょう。左側が入力で右側が出力です。

f:id:castlejou:20151113232813j:plain

図のHの箱で表されてるゲートはアダマール変換という1キュービット用のゲートです。そもそものスピンの状態がベクトルで表されているため、演算子は行列表記です。

{ H = \left( \begin{array}{cc} 1 & 1 \\ 1 & -1 \end{array} \right) }

例えば状態|0>や|1>をアダマール変換すると

{ H \left | 0 \right \rangle = \dfrac{\left | 0 \right \rangle + \left | 1 \right \rangle}{\sqrt{2}}, 
H \left | 1 \right \rangle = \dfrac{\left | 0 \right \rangle - \left | 1 \right \rangle}{\sqrt{2}} }

となり、重ね合わせ状態を作ることが出来、入力状態は

{ \left | \phi \right \rangle = \dfrac{1}{2}(\left | 0 \right \rangle \left | 0 \right \rangle - \left | 0 \right \rangle \left | 1 \right \rangle + \left | 1 \right \rangle \left | 0 \right \rangle - \left | 1 \right \rangle \left | 1 \right \rangle ) }
となります。


次はUfっていう箱ですが少しややこしいです。まず制御NOTゲートという2キュービット以上用のゲートを説明します。これは第一キュービットが0なら第二キュービットはそのまま、第一キュービットが1なら第二キュービットは反転させます。(のでmod計算記号⊕を使って|x>|y> → |x>|y⊕x>と書けます)

制御NOTゲートは以下の演算子で表されます。

{ CNOT = \left( \begin{array}{cccc} 
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1 \\
0 & 0 & 1 & 0 
 \end{array} \right) 
}

Ufの話に戻ります。例えば状態|00>(|0>|0>のこと)で f(x) がタイプ(1)の時、|0>|0> → |0>|0⊕f(0)> = |0>|0⊕1> = |0>|1>という計算をUfが行っています。|00>から|11>まで各入力状態に対して同様にUfを計算してしまいます。


そしてこの出力を第一、第二ごとのキュービットで再度アダマール変換すると第一キュービットが f(x) が青いタイプの時に|0>、 f(x) が赤いタイプの時に|1>、となります。詳しいとこは自分で解いてみてくださいw因数分解は必須です。

こうして、問い合わせが一回で分かるという目的が果たせます。

でもこのままでは連続的に時間発展出来ないので難しいですが時間発展演算子を考えていきます。(すみません書くのめんどくさくて画像です)
f:id:castlejou:20160218155417j:plainf:id:castlejou:20160218155633j:plainf:id:castlejou:20160218155630j:plain

これで以上です。最後にシミュレーションしてみたので図を載せておきます。
左:初期状態
右:アダマール変換後
f:id:castlejou:20151115024745j:plain


制御NOTゲート後の各状態の係数。
f:id:castlejou:20151115024300j:plain

観測後のキュービット
f:id:castlejou:20151115024408j:plain

みたいな感じで量子コンピュータの基礎の基礎、ドイチのアルゴリズムの説明でした。
読んでくれてありがとうございました。
もう少し綺麗にかきたい。。。