LYNCSブログ

慶應義塾大学公認団体 宇宙科学総合研究会(LYNCS)のブログです。

VSCodeでTeXがいじれなくなった

VSCodeTeXがいじれなくなった

皆さんお久しぶりです.あっきーです.僕はVSCodeの拡張性と軽さに惚れてVSCodeを愛用しています.TeXVSCodeで書いてます.しかしつい最近のアップデートによりTeXがいじれなくなるという不具合にぶち当たったのでその解決策について備忘録もかねて書いていきたいと思います.

何が起こったか

まずは何が起こったかについて説明しましょう.うるせえ解決策をとっとと教えろ!って人はここは読み飛ばしてもらって大丈夫です.

突然のエラー

大学の授業でレポートの課題が出たのでVSCodeでこんな感じで打ってコンパイルしたんです.

\documentclass{jsarticle}
    \begin{document}

    \end{document}

が,エラー.しかもこれまで見たことのないエラーメッセージ(´・ω・`)(recipeってなんだよ)

f:id:lyncs:20180414132130j:plain
recipeってなんだよ

以前作ってコンパイルが通ることを確認しているファイルでも同じエラー(´・ω・`)コンパイラのログを見るとなにやら文字サイズが云々って言ってますがいじった覚えがない. ラボの同期に聞くと「LaTeXWorkshopの更新がかかった2~3週間前からコンパイル通らないんだよね」とのこと.ということは原因はLaTeXWorkshopにあるっぽい.というわけであれこれ調査を始めました.

これまでの設定

VSCodeTeXをいじるにあたり,多くの方はelechoさんのこの記事

elecho.hatenablog.com

を参考にしていると思います.僕もそうです.この記事ではLaTeXWorkshopによるタイプセットにlatexmkではなく,ptex2pdfを使用するために"latex-workshop.latex.toolchain"という設定を使っています.(なぜptex2pdfを使うかは引用元に書いてあるので参照してください)

これまではこのtoolchainが動くことでTeXのタイプセットを行っていました.

仕様変更

あれこれ調べているとsettings.jsonにこんな警告が. f:id:lyncs:20180414132136j:plain これってつまりtoolchainが廃止されてるってことか?と思いデフォルトの設定を読み込むとこんな部分が.

"latex-workshop.latex.recipes": [
    {
    "name": "latexmk",
    "tools": [
        "latexmk"
    ]
    },
    {
    "name": "pdflatex -> bibtex -> pdflatex*2",
    "tools": [
        "pdflatex",
        "bibtex",
        "pdflatex",
        "pdflatex"
    ]
    }
],
"latex-workshop.latex.tools": [
    {
    "name": "latexmk",
    "command": "latexmk",
    "args": [
        "-synctex=1",
        "-interaction=nonstopmode",
        "-file-line-error",
        "-pdf",
        "%DOC%"
    ]
    },
    {
    "name": "pdflatex",
    "command": "pdflatex",
    "args": [
        "-synctex=1",
        "-interaction=nonstopmode",
        "-file-line-error",
        "%DOC%"
    ]
    },
    {
    "name": "bibtex",
    "command": "bibtex",
    "args": [
        "%DOCFILE%"
    ]
    }
],

これだー!!!(ラボで叫びそうになりました.一番下っ端なので叫べませんでしたが) つまりLaTeXWorkshopの更新によってtoolchainは廃止され,かわりにrecipeという機能に置き換わっていたってことですね.機能の根幹にかかる部分を突然変えるなよって感じですが,英語圏ではそもそもjsarticle使わないし仕方ないか(?)

解決策

原因が判明したのであとは設定をいじるだけ.これまでのtoolchainの記述を消去し,以下の記述に変えました.とりあえず問題なく動くことを念頭に置いて設定したので汚いかつ無駄のある設定になっています.

"extensions.autoUpdate": false, //今回の原因となった自動アプデをしない
    "latex-workshop.latex.recipes": [
        {
            "name": "ptex2pdf",
            "tools": [
                "ptex2pdf",//タイプセットに使うtoolの名前
            ]
        }
    ],
    "latex-workshop.latex.tools": [//タイプセットに使うtool一覧
        {
            "name": "latexmk",
            "command": "latexmk",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-pdf",
                "%DOC%"
            ]
        },
        {
            "name": "ptex2pdf",//ptex2pdf自体の設定はこれまでと一緒
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "%DOC%"
            ]
        },
        {
            "name": "bibtex",
            "command": "bibtex",
            "args": [
                "%DOCFILE%"
            ]
        }
    ], 

ここの設定でうまいことやると,一度のタイプセット操作で複数回のタイプセットを一気にやってくれるみたいですね.あとタイプセットごとに使うツールを変えたいときにF1で開くコマンドからツールの選択ができるみたいです.そこまで調べる気力は当時の僕にはなかったみたいです()

とにかくこれでタイプセットが通るようになりました.よかったよかった. さて,レポート書いてきます( ´Д`)ノ~バイバイ

2018年版 C言語/C++ 入門者のための環境構築 (Windows編)

対象となる読者

  • C言語/C++言語を始めたいが、環境が構築できていない
    • 大学の授業などでC言語を学習する必要がある人もこれに含みます
  • プログラミング自体経験がほとんどない
  • PCの基本操作は理解している

この記事を書いた理由

LYNCSでは、マイコンを用いたロボット等の制御にC++が使われることがあるため、プログラミング初心者でもC/C++から入る層が一定数居ます。 また、大学の一般教養科目として開講されるプログラミングの授業では、C言語を学ぶものもあります。 そういった状況を想定して、環境構築でつまづくことなく、言語の学習に集中できる一助となる記事を書きたいと思った次第です。

まず、本当にC/C++から入門して大丈夫?

あくまで筆者個人の考えですが、初心者が最初に学ぶ言語として安易にC/C++を選ぶのは良くありません。もちろん、理由や信念があってC/C++を学ぶのであれば全く問題はありません。

ここに辿り着いた方のうち、C/C++を学ぶ動機・理由が明確な方は次のセクションまですっ飛ばして環境構築を始めてください。逆に、プログラミングというものが何かはよく分からないけど触ってみたい方や、ゲームやスマホのアプリなど何か作りたいものがあるという方はこれからの文章を読むことをおすすめします。

C言語はOSの開発やプログラミング言語自体の開発などには欠かせない存在で、とても重要な言語であることは事実です。 しかし、ゲームやスマホアプリ、Webアプリ、人工知能(AI)などを開発したい場合には不向きな言語です。世の中には、それらに最適な言語が数多く存在しています。 そういった言語などがあるのにあえてC言語を使うのは、新幹線があることを知りながら自転車で東京-京都間を往復するようなものです。

さらに、作りたいものが作りづらいだけでなく、C/C++にはとても難解な概念が登場します。つまり「初心者殺し」でありながら、言語を習得したところで初心者にも作りやすいアプリを作れないという、プログラミング学習の挫折につながりやすい言語なので、特に理由がない限りはCを「最初に学ぶプログラミング言語」として選ぶことはおすすめしません。漠然とC/C++を最初の言語として選ぶと、殆どの人はプログラミングに対する苦手意識を持ってしまうだけだと思います。逆に、何かしらの言語を学んだあとにC/C++を学ぶと、あらゆるプログラミング言語に共通する一般的な事柄はスキップしてC/C++固有の難しい概念だけに集中できるので、スムーズに学習出来るようになると思います。 (そういう理由もあってか、近年はプログラミング学習スクールなどでも初心者向け講座としてはRubyやNode.js、Pythonといった言語が選定されることが多いようです。)

また、よく言われる話として「C言語は様々な言語に影響を与えた存在だから、C言語をやっていれば応用が効く」「あらゆる言語はCで開発されているので、Cを理解すれば言語も深く理解できる」というものがあります。
これを外国語の学習に例えると「ラテン語はヨーロッパのさまざまな言語に影響を与えているので、外国語を学びたければラテン語から始めると深く理解できる」といった感じになると思います。確かにそれは事実かもしれませんが、メリットに比べてあまりにもデメリット(負担や挫折のリスク)の方が大きすぎます。

英語圏で活躍したければ英語を、フランスに行きたければフランス語をまずは学べばいいのです。ラテン語ギリシャ語など、それらに影響を与えた言語を学んで文法や単語を詳しく理解するのは後回しでもいいはずです。 プログラミングでもそれは同じで、Webアプリを作りたければWeb向けの言語を、スマホアプリを開発したければスマホアプリ向けの言語を最初に学ぶのが一番なのではないでしょうか。それらを習得した後に、C/C++を学んでも遅くはありません。 (やりたいことに直結している方がモチベーションも続きますからね)

大学での初心者に対するプログラミング講義ではC言語を使うべきでない」といった記事でも解説されていますのでこちらも紹介しておきます。

C/C++が向いていないなら何の言語を選べばいいの?

やりたいことを最初に掲げて、それから言語を選んでいいと思います。

  • ゲーム開発/AR/VR - Unity
    • UnityはPCだけでなくスマホAndroid/iOS)でも動作するため、移植の度にハードに合わせてプログラムを書き直さないで済むのが強みです。最近は家庭用ゲーム機向けの開発にも利用されることがあるほか、VRなどでもよく利用されています。
  • スマホアプリ開発 - Java/Kotlin (Android)、Swift (iOS)
  • Webアプリ開発 - RubyJavaScript
  • 機械学習/深層学習/人工知能 - Python
    • 最近流行りのAIなどを触りたいならPython一択です。ライブラリはPython向けのものが圧倒的多数ですし、Jupyter Notebookを始め研究向きの環境も整っています。
  • 統計学 - R
    • 統計処理に最適化された言語です。統計を扱うならまずはRから始めて、より詳細な分析・処理を行うならPythonの学習に進んでもいいかもしれません。
  • 特にやりたいことがない - JavaScript
    • 言語としてめちゃくちゃ優れているというわけではなく、プログラマからは時々批判されることもある言語ではあります。しかし、Webページ、Webアプリ、ブラウザ拡張機能スマホアプリ、PC向けアプリ、IoT機器……などと、あらゆる場面で使用できる言語なので、やっておいて損はないと思います。言語自体も難解ではないため「積極的にエンジニアになりたいわけではないが、スキルとしてプログラミングを身に着けたい」という層にもマッチすると思います。
    • 最近になって仕様がいろいろと追加されている言語なので、古い参考書などはあまり役に立たないと思います。出来る限り新しい本で学ぶことをおすすめします。

逆にどういう人はC/C++から始めるといいの?

  • 機械工学を学ぶ人
    • ロボットなど各種機械の制御として利用される言語は今でもC/C++が中心です。
  • 競技プログラミングをしたい人
    • 多くの競技プログラミングにおいて言語の選定は自由ですが、実行速度の面で有利なC/C++が事実上の標準となっています。
  • プログラミング言語やOSを作りたい人
  • コンピュータの動作を詳しく理解・把握しながらプログラムを書きたい人
    • C/C++では、他の言語ではあまり意識しなくても済むような、メモリやCPUといったコンピュータの内部にある要素をほぼ常に意識してコードを書いていく必要があります。先ほど「C/C++を初心者には勧めない」と書いた理由の1つでもありますが、このあたりの動作に関心がある人にとってはむしろメリットになるかもしれません。
  • 大学の授業がC/C++の人
    • これはもうどうしようもないので頑張っていきましょう。

1. コンパイラのインストール

MinGW(ミン・ジー・ダブリュー)というソフトウェアを使って、gccというコンパイラをインストールしましょう。

Windows向けならVisual Studio(VS)を利用するという手もあります。 ただし、VSは大規模な開発向けのソフトであるため使わないような機能が多くて入門には分かりづらいほか、動作が重いなどプログラミング学習にはデメリットが目立つのでオススメしません。

まず、http://www.mingw.org にアクセスし、右上の「Download Installer」をクリックします。 f:id:lyncs:20180310042602p:plain

しばらくするとページが切り替わり、SourceForgeという外部サイトから自動的にダウンロードが開始されるはずです。 インストーラをダウンロードし、任意の場所に保存するかそのまま実行してください。 f:id:lyncs:20180310042703p:plain

インストーラを実行すると以下のような表示になります。 「Install」をクリックしてください。 f:id:lyncs:20180310042921p:plain

特に変更せず、「Continue」をクリックしてください。 (なお、Cドライブの空き容量が少ないなどでインストール先を変更した場合はその後のパスを適宜読み替えてください) f:id:lyncs:20180310043031p:plain

必要なファイルのダウンロードが始まります。しばらくお待ちください。 f:id:lyncs:20180310043144p:plain

ダウンロードが完了すると「Continue」をクリックできるようになりますので、クリックしてください。 f:id:lyncs:20180310043407p:plain

スタートメニューやデスクトップに「MinGW Installation Manager」というショートカットが作成されるはずなので、これを起動しましょう。

MinGW Installation Managerが起動したら「mingw32-base」という項目をクリックし、現れるメニューの中から「Mark for Installation」をクリックしてください。 f:id:lyncs:20180310043908p:plain

「mingw32-gcc-g++」という項目にも同じ操作を行ってください。以下のような画面になるはずです。 f:id:lyncs:20180310044018p:plain

「Installation」メニューから「Apply Changes」をクリックしてください。 f:id:lyncs:20180310044100p:plain

「Apply」をクリックしてください。 f:id:lyncs:20180310044157p:plain

必要なファイルがダウンロードされます。そのままお待ちください。 f:id:lyncs:20180310044218p:plain

完了したら「Close」をクリックしてください。 f:id:lyncs:20180310044252p:plain

このような画面になれば、MinGW Installation Managerを閉じて構いません。 f:id:lyncs:20180310044322p:plain

2. パスを通す

インストールしたgccを開発環境から利用できるようにします。以下はWindows 10の場合です。

スタートメニューを右クリックし、コントロールパネルを開きます。 f:id:lyncs:20180310044545p:plain

検索欄に「環境変数」と入力すると現れる「環境変数を編集」をクリックします。 f:id:lyncs:20180310044611p:plain

上の欄で「Path」を選択し、「編集」をクリックします。 f:id:lyncs:20180310044625p:plain

「新規」をクリックします。 f:id:lyncs:20180310044804p:plain

「C:\MinGW\bin」と入力し、追加します。 以下のような画面になれば完了です。 f:id:lyncs:20180310044825p:plain

3. 拡張子の表示

プログラミングをする上で拡張子を表示していないと何かと困ることがあるので、Windowsの設定を変えて表示しておきます。

適当なフォルダを開いて上部の「表示」をクリックし、「拡張子の表示」にチェックを入れます。 f:id:lyncs:20180310045028p:plain

4. エディタのインストール

書籍やサイトによっては「メモ帳」でも出来ると書かれていることがありますが、きちんとしたプログラミング向けのエディタを使うことでより学習しやすくなります。 ここでは、2018年現在でよく使われている「Visual Studio Code」(VS Code)を利用しましょう。(「Visual Studio」と名前が似ていますが、「Code」の方はソースコードの編集に特化した軽量・シンプルなソフトです。)

プログラミング用のエディタとしては「TeraPad」や「サクラエディタ」などが挙げられることもありますが、2018年現在では残念ながら時代遅れ感が否めませんので VS Code をおすすめします。

https://code.visualstudio.com にアクセスし、「Download for Windows」をクリックします。 インストーラがダウンロードされるはずです。 f:id:lyncs:20180310045205p:plain

インストーラを実行したら、「次へ」をクリックします。 このあたりはインストーラの指示に従って進めてください。 f:id:lyncs:20180310045518p:plain f:id:lyncs:20180310045538p:plain f:id:lyncs:20180310045548p:plain f:id:lyncs:20180310045554p:plain

ここでは、全てにチェックを入れてください。 f:id:lyncs:20180310045624p:plain

インストールを進めてください。 f:id:lyncs:20180310045640p:plain f:id:lyncs:20180310045712p:plain

インストールが完了すると「Getting Started」といったWebページが開くことがありますが、読む必要がなければそのまま閉じてください。

VS Codeが開くと、「警告:Gitが見つかりません」というエラーが出ますが、「今後は表示しない」をクリックしてください。 また、一旦右下の「×」をクリックしてください。 f:id:lyncs:20180310045919p:plain

5. コードを書いて実行していく

一般的な参考書では、エディタでコードを書いてコマンドプロンプトなどから実行するように指示されていると思います。 VS Codeはコマンドプロンプトをウィンドウ内に呼び出すことができるので、より効率的な学習ができると思います。

Ctrl + @ を入力してください。すると、統合ターミナルが開くはずです。(もう一度 Ctrl + @ を押すと閉じます) 最初に表示したときは「規定のターミナルシェルをカスタマイズ」といったメッセージが出ると思います。 特にこだわりがなければ、Microsoftコマンドプロンプトの後継としている「PowerShell」にしていいと思います。 (参考書や解説サイトではコマンドプロンプトの利用を指示している方が多いと思うので、違う物にするのが怖ければコマンドプロンプト(cmd)でも大丈夫です) f:id:lyncs:20180311021702p:plain

また、プログラミングにおいては「フォルダ」(ディレクトリ)を1つの単位としてプロジェクトを進めていくことが多いです。とりあえず全部マイドキュメントに保存、といったことは行いません。
ですので、とりあえず何らかの作業用フォルダを作成しておきましょう。(日本語文字列が含まれないファイルパスが望ましいので、Cドライブ直下などに programming のようなフォルダを作ると無難だと思います。)
学習が進んでいったら、この作業用フォルダ内にサブフォルダを作成して細分化していっても良いと思います。

また、VS Codeもプログラミングしやすくするため、「フォルダごと」開くことが出来ます。 左側の「エクスプローラー」ボタンをクリックして「フォルダーを開く」をクリックするか、ファイル→フォルダーを開く をクリックしてください。 f:id:lyncs:20180311023021p:plain

フォルダを作成したら新規ファイルを作成しましょう。 「ファイル」→「新規ファイル」で新しいタブが開くはずです。(「ようこそ」タブは閉じてOKです)
Hello Worldでも書いてみましょう。 f:id:lyncs:20180311023521p:plain

ファイルを保存しましょう。hello.c あたりで、拡張子 .c を付けるのをお忘れなく。 f:id:lyncs:20180311023618p:plain

拡張子を付けたファイルは言語に応じて色付け(シンタックスハイライト)してくれます。プログラミング向けエディタの強みの1つです。 f:id:lyncs:20180311023641p:plain

Ctrl + @ を押して統合ターミナルを開くと、既に現在開いているフォルダに移動した状態のPowerShellがウィンドウ内で開いてくれます。 コンパイルするコマンド gcc hello.c を入力して Enter を押してください。 f:id:lyncs:20180311023916p:plain

コンパイルが完了すると同じフォルダに実行ファイルが出力されます。
今回はコンパイル時に出力ファイル名を指定しなかったので a.exe という名前になっているはずです。 f:id:lyncs:20180311024013p:plain

これを実行してみましょう。統合ターミナルに .\a.exe と入力してください。(a.exe の前に .\ ドットとバックスラッシュを入力することをお忘れなく。バックスラッシュはWindows環境では円マークと同じ文字列です。)
無事実行できれば以下のような表示になるはずです。 f:id:lyncs:20180311024130p:plain

環境構築とHello Worldの実行手順を把握するところでこの記事は終わりです。
ここから先はお手持ちの参考書や授業をベースにして進めていってください。それでは良き開発ライフを!

LYNCS とは?

慶應義塾大学文化団体連盟所属団体 宇宙科学総合研究会 LYNCS (Laboratory of sYNnthetic Cosmic Science, リンクス)はその名前の通り、宇宙について様々な面から研究、アプローチをするサークルです。
工学分野では電子工作やプログラミングを扱い、模擬人工衛星CanSat」の開発やドローンの開発などを行っています。プログラミング・電子工作の初心者でも興味がある方なら大歓迎です!先輩がサポートしていきます! (実際、プログラミング未経験だった1年生が、その年の終わりにはRaspberry Piなどを利用して自律走行ロボットやドローンを自作できるようになりました。)
慶應義塾大学に進学される方、在学中の方でご興味をお持ちの方は、公式Twitterメールなどでお気軽にお問い合わせください!

下田観測(12/16-17),皆既月食観測(1/31)記録

f:id:lyncs:20180219221824j:plain1年の中でもこの時期は空が澄んで星がとてもきれいに見えますよね^^ f:id:lyncs:20180209153942j:plain (下田にて2017.12.16)

本サークルの天文研究本部では活動の一環として12月に初島下田(静岡県)へ観測合宿を,1月に大学で皆既月食(とても綺麗でしたよね!)の観測を行いました!

が,さすがLYNCS.いろいろな珍事がありましたのでそこも含めて綴ってみました.是非,一緒に観測する気持ちで目を通していただければ幸いです^^  筆者は天文研究本部長のまさよです.駄文ですがよろしくお願いします!

まず読んでいただくにあたって,前提として以下のことを踏まえるとより楽しんでいただけるかと.笑

  • 弊本部は観測活動を主体としている
  • 弊本部には雨男(女)が3人もいる(筆者を含む).(これはあくまでも説です.信じたくはないですが,この3人が共にいるとあまりにも天候に恵まれないためこのような扱いになりました)

下田観測合宿(12/16~17)

12月に行ったのが静岡県での観測!!9月に予定していた裏磐梯への観測合宿が台風で流れ,その後は三田祭や中間試験などで観測が出来ていなかったこともあって皆意気込んで計画を立ててくれていました!また,12/14はふたご座流星群の極大でもあり,(もしかしたら流星のおこぼれが見られるのでは...?)という淡い期待も抱いていました笑

ここで何といっても天気が問題ですよね!合宿は雨というジンクスが成り立ちつつある弊団体では死活問題です笑

心配していた天気は前日にみたGPV予報によると,夜はなんと快晴!! f:id:lyncs:20180210154501j:plain しかし!!!実は当初の予定は下田ではなく,光害がかなり少ない初島で合宿をする予定でした.当日の15時までは...

正直不安はあったんです.雨男・雨女3人衆が集まって天気が良いなんて,何か起こるのでは と.

目的地に着くまで数々の不幸が我々を襲いました.

まずファーストジャブで東海道線の運転見合わせ. f:id:lyncs:20180219215449j:plain 本来初島には,熱海港からの高速船が出ていたためその熱海港で集合して行くという予定でした.熱海港は熱海駅からバスで行けるため,とりあえず熱海駅でお昼を食べて...と思ったら!!

このタイミングで運転見合わせって...船に間に合わないと島へ行けないので,何人かは急遽新幹線に乗って来ていました.続々と熱海駅へ集まる中 ,致命的な情報が入ります.

高速船の運航ストップ

………嘘でしょ??

ただでさえあたふたしていたのに更なる追い打ち.海上の風が強まったということで,ジャブからの一発KOでした...晴れていても結局目的地には着けませんでした.

とは言っても皆わざわざ機材を携えて熱海まで来ていたのでこのまま帰(させ)るわけにもいかない..ということで,光害の少ない伊豆沿岸部の宿を必死に探して見つけたのがここ!浜屋さんです. f:id:lyncs:20180219220649j:plain 大人数で天体観測ということでわざわざ大部屋かつ門限無しにしていただきました!ありがとうございます...!

そんなこんなで無事宿に到着して観測準備!!天候はなかなか晴れないものの,予報では1時ごろに晴れるということで,それまで各々機材整備や仮眠をしたりメシエ天体カードゲーム(意外と面白いんです!)をしたりしていました. f:id:lyncs:20180219223543j:plain (観測前準備の様子)

そしてついに1時ごろ,晴れました!!!ただ風が強い...  観測場所を探している時も台風並みの風で移動すら大変でした.もちろん防寒は万全です!

観測チームを丘と海沿いの2班にわけ,それぞれ観測を行いました. 私は丘の班でしたが,周りが森林に覆われていたとはいえとにかく風が強くて寒かった...一眼でインターバル撮影をしていた時はとにかく身を縮めてじっとしてました笑

でも!!肝心の星は冬の有名な星座から春の星座までとってもきれいに見えました^^  しかもふたご座流星群の極大日付近という時期もあって度々流星も見られたんです.雨男云々とは何だったのか,その時ばかりはそう思いました笑 f:id:lyncs:20180219221749j:plain (近くの神社の鳥居とともに.) f:id:lyncs:20180219222414j:plain (オリオン座) f:id:lyncs:20180219222514j:plain (インターバル)

最後に後輩の望遠鏡で上ってくる火星・木星を見て,海沿い班と一緒に宿へ帰還しました.その後はもうお察しですよね笑.数分で部屋が寝息に包まれました.お疲れ様です. f:id:lyncs:20180219223704j:plain (下田の港.朝日(?)がまぶしい!)

これにて無事,下田観測合宿終了!!初島には行けなかったけど色んな意味で充実した観測でしたね.島へ泊まりで行くときは本州での宿も検討しておくべきだと学びました笑

LYNCSでは3/17,18に御蔵島での観測合宿を予定しています!!今度こそは何のトラブルもなく終えたいものです笑

皆既月食観測(1/31)

下田の合宿後,年越しをして大学の期末試験をようやく終えた頃に来た天文のビッグイベント!!!皆既月食!みなさんも空を見上げたのではないでしょうか.今回の月食スーパームーンと被って大きな月がみるみる欠ける様子が見えました.

今回LYNCSでは前々から塾生新聞さんに取材を依頼されていたこともあり,日吉キャンパス(途中から矢上キャンパス)でこの天体ショーを観測しました. f:id:lyncs:20180219223813j:plain (観測の様子)

みんな20時にはキャンパス中庭に集合し,各自機材を準備した後,20時48分ごろに月の左側が少し欠け始めました.私自身初めての皆既月食体験だったのでわくわくでした^^ f:id:lyncs:20180219224013j:plain (部分月食

その後日吉から矢上へ観測場所を移し,赤い皆既月食を心行くまで観測しました.綺麗でしたね^^ 矢上キャンパスは理工の研究室が集まっていて卒論発表前ということもあり,24時ごろでも多くの学生が空を見上げていました.

天体望遠鏡でも観測したのですが,月が暗すぎて導入するのにかなり時間がかかっていました.やっぱり月を照らす太陽の光は偉大です笑 f:id:lyncs:20180219224049j:plain皆既月食

こんな感じで皆既月食の観測を行いました!先述したように,この時撮影した写真の一枚が慶応義塾の塾生新聞に掲載されています!!以下のサイトから是非ご覧くださいね^^

www.jukushin.com

以上,LYNCS天文研究本部が12,1月に行った活動の記録になります.これからももっと観測を行っていきたいと思っています.ここまで読んでいただいた方,ありがとうございました!!それでは!

量子情報科学序論 IBM Qを動かして学ぶ量子コンピュータ

【前置き】この記事は『量子コンピュータ Advent Calendar 2017』の12月16日分です. 11月の三田祭(慶應義塾大学の文化祭)にてLYNCSが配布した部誌『Escape Velocity』の記事を一部改訂(最新のニュースを反映)したものになっております.

$$ \newcommand{\bra}[1]{\left\langle #1 \right|} \newcommand{\ket}[1]{\left|#1 \right\rangle} \newcommand{\bracket}[2]{\left\langle #1 \middle|#2 \right\rangle} $$

概要

量子計算機アルゴリズムの基礎を学びます. 直感的理解のため, 読者が実際にIBMの保持する量子計算機クラウド上で実行できるように導入します. 最後に少し最近のニュースに触れています.

はじめに

みなさん初めまして. LYNCS理学研究本部所属のTsujishin(@shin_tsujido)と申します. 本年度, LYNCS理学研究本部では量子情報科学輪講を行いました. 量子情報科学は年々規模が拡大しており, 各国各企業の研究の一部は実装の段階に移行しつつあります. 一方,量子情報科学が世間から十分に理解を得られているとは言い難いです(『量子コンピュータ』の定義の議論含め). よって本誌では学部1年レベルの線形代数以外に前提知識を必要とせず, 分野に関しての一歩目となるような序論を展開します. また, 読者が量子コンピュータ(IBMQ)の操作を一通りできるような導入を行います.

量子情報科学とは

量子情報科学とは, 量子力学を物理的基盤(ハードウェア構成要素が従うことわり)としている情報科学(コンピュータ科学を含む)のことです. 具体的には, 量子コンピュータ(計算機)や量子通信, 量子暗号などに関する学問です. 80年代にベニオフやファインマン, ドイチュの構想から始まった分野ですが, 人類の不断の努力によって実用段階になりつつあります. 多くの量子情報科学におけるアルゴリズムは後述する重ね合わせや量子もつれなどの性質を用いることでより効率的な計算やより安全な通信を実現しています. 1

量子コンピュータ

ガ○ダム00やマブ○ヴオルタなどのSFでもよく目にする量子コンピュータ. それは果たしてどのようなコンピュータなのでしょうか. 理想的な計算機(コンピュータ)のモデルとしてよく語られるものにチューリングマシンがありますが, 量子コンピュータのモデルの一つである量子チューリングマシンは, 計算可能性(どんな問題を解くことができるか)は等価になっています. チューリングマシンで解くことができない問題は量子チューリングマシンでも解くことはできません. しかし, 解くことができる計算において, 計算量(計算の手順数)では, 量子チューリングマシンチューリングマシン以下になること, すなわちより効率よく計算できる可能性があることが示されています. また, 量子チューリングマシンチューリングマシンのエミュレート(動作の真似をすること)ができます.

量子ゲート(回路)方式計算機と呼ばれる方式は量子コンピュータで最も歴史的に研究されてきました. 量子ゲート方式は既存のコンピュータの汎用性を引き継ぎ, さらに計算を効率化することを目標としています. また, 断熱計算機や量子シミュレータなどと呼ばれる計算機がよく量子ゲート方式計算機への比較の対象として取り上げられてきました. 断熱計算機には量子アニーリング方式と呼ばれるタイプのコンピュータがあります. 量子アニーリング方式計算機は, カナダのD-Wave社が実用化し話題を呼びました. 他にもコヒーレントイジングマシン(開発者の方は量子ニューラルネットワークと呼称されています)と呼ばれる光を用いた計算機が比較対象にされることもあります. 量子アニーリング方式やコヒーレントイジングマシンは最適化問題(サラリーマン巡回問題やグループ分けの問題など. グラフ理論などに関連する問題)を解くことに特化しています. コヒーレントイジングマシンは分かりやすく基本的な仕組みが説明されている記事があるのでリンクを貼っておきます.

codezine.jp

また, クラウドで実際に動かすこともできます.

QNNcloud

これらさまざまな非ノイマン型計算機(特殊な計算機)のうちいくつかは, 量子力学的性質を用いることで様々な問題の計算量(計算複雑性)を減らすことを試みています. 計算量とは, 問題を解くのに当たって必要な計算の回数なので, これを減らすことによってより短い時間で計算できるようになります. 現在, 量子コンピュータ開発は規模を拡大しつつあります. アメリカ国防省は毎年約220億円投資しており, EUは2019年からの10年で1300億円, 日本も来年度予算で32億円投資予定です. 2 世界中の研究室で量子コンピュータなどの非ノイマン型計算機の開発は続いており, 以下のように様々な物質の性質を用いた非ノイマン型計算機が研究されています.

(A)ゲート方式

  1. 超電導(トランズモンなど) IBM, Googleなど
  2. 光子 東大古澤研
  3. シリコン核スピン 慶應伊藤研

(B)量子アニーリング

*超電導 D-Wave, 東工大西森研, USC

(C)コヒーレントイジングマシン

*光(パルス) NTT, NII, Stanford

量子力学的性質

物理を古典力学から量子力学に拡張したら、計算は拡張されたんだ。それは、これまで数学的に決まっていると思っていた計算が、実は古典物理をもとに作られた計算だったからだ。そのことに我々は気づいていなかった. - David Deutsch(1953〜)3

量子力学を用いると何が今までのコンピュータ(量子情報科学者は敬意を込めて古典コンピュータと呼称する)や通信と違うのでしょうか. そもそも量子力学とは, 電子や光子(フォトン)などミクロな領域から始まった物理学です(マクロな物体における量子力学の話は長くなるので今回は割愛します).量子力学においてはマクロな世界観を持った我々の感覚とは異なる現象が多々起こります.

例えば, 量子力学では, 観測という概念が非常に重要です. 古典力学(非量子力学)では, 初期値(例えば物体の位置や速度, 加速度)がわかればその後の運動は基本的に予測できます(外部からの影響がない限り). しかしながら量子力学では, 観測するまでその後の推移は確定できません.

量子力学の最も重要な現象(概念)として, 重ね合わせと量子もつれという現象があります. 量子コンピュータでは, これらの現象を用いて量子ビットと呼ばれる情報単位を生成し, 計算を行っています.

量子ビット

古典コンピュータでは, 情報の最小単位としてビット(bit)を用います. ビットは、0もしくは1の2通りの情報を表現することができます. これをn個用意することによって, 2nの状態を表現することができます. 量子情報科学分野では, 古典ビットと呼称します. 古典ビットは, 物理的には主に電圧の高下などを用います. また, 古典ビットはコピーすることができます.

それに対し, 量子コンピュータ量子ビット(Qubit)と呼ばれる情報の単位を用います. この量子ビットは, 古典計算機のビットのように, 二つの情報を表現することができます. この時, 量子ビットでは, 二つの直行するベクトル(二次元複素ベクトル空間での正規直交基底)を用いて情報を表現します.4 また, 量子分野ではよく, ベクトルをブラッケット記法という記法で表現します. ブラケット記法では, 任意のベクトルは,$\ket{}$(ケットと読みます)のような記号に入れて表現します.
例えば, 古典ビットにおける0と1に相当する単純な状態は,

$$ \ket{0} ≡ \left( \begin{array}{r} 1 \\ 0 \\ \end{array} \right) \ket{1} ≡ \left( \begin{array}{r} 0 \\ 1 \\ \end{array} \right) $$

のように表現されます. ケットの中に入る数字もしくはアルファベットは, 特に意味はなく, ラベルづけ(ベクトルに名前をつける)として機能します. つまり,

$$ \ket{*°Д°} ≡ \left( \begin{array}{r} 12345 \\ 54321 \\ \end{array} \right) $$

のようにケットの中には好きなものを入れてベクトルを置くことができます. なお量子力学では, 主に$ψ$(プサイ)や$φ$(ファイ)を用います. なお, 複数の量子の状態を表す時, $\ket{}$の中に複数の状態を入れることもできます. 例えば, $\ket{0}$の量子ビットが二つあった時, $\ket{00}$のように表現することができます.

この量子ビットをより視覚的に捉えるツールとして, ブロッホ球という概念があります. 球の表面は中心からの距離がどこでも等しいので, 2次元複素ベクトル空間内のあらゆる単位ベクトルを表現可能です. ブロッホ球はベクトルのZ軸で$\ket{0}$と$\ket{1}$を観測できる確率を表し、XY平面の角度で位相を表します。北極が$\ket{0}$, 南極が$\ket{1}$に相当します. 例えば,

$$\ket{ψ}=\cos\frac{θ}{2}\ket{0}+exp(iφ)\sin\frac{θ}{2}\ket{1}$$

は以下のようになります.

f:id:lyncs:20171217235309j:plain
ブロッホ

量子ビットは, 物理的には光子や電子のエネルギー, 原子のスピンなどで実現されます.

重ね合わせ

古典ビットにはない性質として, 量子ビットは古典ビットと違い, 0と1が共存した状態を生成することが可能になっています. この共存した状態とは, 2次元複素ベクトル空間内のあらゆる単位ベクトル(大きさ1のベクトル)を表現可能です.

$$ \ket{ψ} =a\ket{0}+b\ket{1} = \left( \begin{array}{r} a \\ b \\ \end{array} \right) $$

この式が意味するのは, 確率$|a|^2$で状態$\ket{0}$, 確率$|b|^2$で状態$\ket{1}$が観測できるという状態です. 例えば,

$$ \ket{ψ} =\frac{\ket{0}+\ket{1}}{\sqrt{2}} = \frac{1}{\sqrt{2}}{\left( \begin{array}{r} 1 \\ 1 \\ \end{array} \right)} $$

では,それぞれ $\left( \frac{1}{\sqrt{2}} \right) ^2=\frac{1}{2}$の確率で状態$\ket{0}$, $\ket{1}$を観測できます.

このような現象を活用することで, 複数のデータ(状態)に対して同時に操作を行うことができ, 古典コンピュータへのアドバンテージになっています. 物理的にどのようなことであるのかなどより深く知りたい方は, "シュレーディンガーの猫"などに関して調べてみてください.

量子もつれ

もう一つ古典ビットと明確に違う性質として, 量子もつれがあります. これは, 複数の量子ビットにおいて発生することのある特殊な相関です. まずは簡単のため, 二つの量子における量子もつれを考えましょう. 1つ目の量子をA, 2つ目の量子をBとします. ここで2量子のもつれかつ重ね合わせの4つの状態(Bell pair)を例に出してみましょう.

$$ |\Phi^+\rangle ≡ \frac{1}{\sqrt{2}} (|0\rangle_A \otimes |0\rangle_B + |1\rangle_A \otimes |1\rangle_B) $$ $$ |\Phi^-\rangle ≡ \frac{1}{\sqrt{2}} (|0\rangle_A \otimes |0\rangle_B - |1\rangle_A \otimes |1\rangle_B) $$ $$ |\Psi^+\rangle ≡ \frac{1}{\sqrt{2}} (|0\rangle_A \otimes |1\rangle_B + |1\rangle_A \otimes |0\rangle_B)\ $$ $$ |\Psi^-\rangle ≡ \frac{1}{\sqrt{2}} (|0\rangle_A \otimes |1\rangle_B - |1\rangle_A \otimes |0\rangle_B)\ $$

例えば$|\Phi^+\rangle$では,確率$\left( \frac{1}{\sqrt{2}} \right) ^2=\frac{1}{2}$で A,B共に$\ket{0}$, 確率$\left( \frac{1}{\sqrt{2}} \right) ^2=\frac{1}{2}$でA,B共に$\ket{1}$という意味です. $|\Phi^+\rangle$では, バラバラに観測しても片方のみが0, もう片方が1,という結果は得られません. 片方の量子ビットを観測した時点で両方の状態は確定するということを意味します.

このように, 多量子系において, 複数の量子の状態が不可分になっている状態を量子もつれと呼称します. 物理的にどのようなことであるのかなどより深く知りたい方は, "EPRパラドックス", "CHSH不等式"などに関して調べてみてください.

ゲート方式量子コンピュータ

量子ゲート(回路)方式計算機では, 量子回路を用いて量子ビットを操作します. これは, 既存の計算機における電子回路の論理回路の拡張になっています. 量子回路は量子ゲート(素子)から構成されており, を量子ビットに対して掛けることを「量子素子を適用する」と呼称します. 量子ゲートは, 図のように, 線の上にボックスを乗せて表記します. この時線一本が1量子ビットを表しています.

f:id:lyncs:20171215224125p:plain

この節では, IBM量子計算機に実装されている量子ゲートを説明します. 量子回路は, 量子ビットから量子ビットへの変換を行い, ユニタリー行列として与えられます.

f:id:lyncs:20171215224243p:plain
量子操作はユニタリーである

任意のユニタリー行列Uは,

$$U^{*}U=UU^{*}=I$$

となっています. ここで, $U^*$は, 行列$U$の転置(後述)かつ複素共役(実部はそのまま虚部の符号を反転すること)な行列, $I$は単位行列となっています. 転置とは, m行n列の任意の行列Aの$(i,j)$成分と$(j,i)$成分を入れ替えたn行m列の行列$A^{\mathrm{T}}$を表します.

また, 単位行列とは, 対角成分に$0$が並び, それ以外に$1$が並んだ行列のことです. つまり, 行列要素$a_ij$に関して,

$$ a_ij= \begin{cases} 1 & (i=j) \\ 0 & (i\neq j) \end{cases} $$

という式が成り立つ行列を表します.

恒等演算子

恒等演算子は以下のような行列で, どのような量子ビットに対して適用しても量子ビットの状態は変化しません. つまり, 入力と出力が等しいゲートということになります. よくIやIdと表記します.

$$ I ≡ \left( \begin{array}{rr} 1 & 0 \\ 0 & 1 \\ \end{array} \right) $$

f:id:lyncs:20171215224429p:plain
適用後も量子ビットは変化しない

パウリXYZゲート

パウリX

$$ X ≡ \left( \begin{array}{rr} 0 & 1 \\ 1 & 0 \\ \end{array} \right) $$

パウリXゲートは, ビット反転演算子とも呼ばれます. これは, パウリXゲートを量子ビットに適応すると, 以下のように$\ket{0}$は$\ket{1}$に, $\ket{1}$が$\ket{0}$に変換できるためです. これは古典におけるNOTゲートに相当します. また, ブロッホ球上では, $x$軸の周りに角度$π$回転させる操作と捉えることができます.

$$ X\ket{0}= \left( \begin{array}{rr} 0 & 1 \\ 1 & 0 \\ \end{array} \right) \left( \begin{array}{r} 1 \\ 0 \\ \end{array} \right) =\left( \begin{array}{r} 0 \\ 1 \\ \end{array} \right) =\ket{1} $$ $$ X\ket{1}= \left( \begin{array}{rr} 0 & 1 \\ 1 & 0 \\ \end{array} \right) \left( \begin{array}{r} 0 \\ 1 \\ \end{array} \right) = \left( \begin{array}{r} 1 \\ 0 \\ \end{array} \right)=\ket{0} $$

量子回路上では以下のように表現します.

f:id:lyncs:20171215230404p:plain

パウリY

$$ Y ≡ \left( \begin{array}{rr} 0 & -i \\ i & 0 \\ \end{array} \right) $$

パウリYゲートは, 位相・ビット反転演算子とも呼びます. ブロッホ球上では, $y$軸の周りに角度$π$回転させる操作と捉えることができます.

$$ Y\ket{0}=\left( \begin{array}{rr} 0 & -i \\ i & 0 \\ \end{array} \right) \left( \begin{array}{r} 1 \\ 0 \\ \end{array} \right) =\left( \begin{array}{r} 0 \\ i \\ \end{array} \right) =i\ket{1} $$ $$ Y\ket{1}=\left( \begin{array}{rr} 0 & -i \\ i & 0 \\ \end{array} \right) \left( \begin{array}{r} 0 \\ 1 \\ \end{array} \right) =\left( \begin{array}{r} -i \\ 0 \\ \end{array} \right) =-i\ket{0} $$

量子回路上では以下のように表現します.

f:id:lyncs:20171215230436p:plain

パウリZ

$$ Z ≡ \left( \begin{array}{rr} 1 & 0 \\ 0 & -1 \\ \end{array} \right) $$

パウリZゲートは, 位相反転演算子とも呼びます.ブロッホ球上では, $z$軸周りに角度$π$回転することを意味します. $\ket{0}$に対しては何も変化させず,$\ket{1}$に対しては, 状態に対しては位相のみ反転を行います.

$$ Z\ket{0}=\left( \begin{array}{rr} 1 & 0 \\ 0 & -1 \\ \end{array} \right) \left( \begin{array}{r} 1 \\ 0 \\ \end{array} \right) =\left( \begin{array}{r} 1 \\ 0 \\ \end{array} \right) =\ket{0} $$ $$ Z\ket{1}=\left( \begin{array}{rr} 1 & 0 \\ 0 & -1 \\ \end{array} \right) \left( \begin{array}{r} 0 \\ 1 \\ \end{array} \right) ] [ =\left( \begin{array}{r} 0 \\ -1 \\ \end{array} \right) =-\left( \begin{array}{r} 0 \\ 1 \\ \end{array} \right) =-\ket{1} $$

量子回路上では以下のように表現します.

f:id:lyncs:20171215230520p:plain

アダマールゲート

$$ H ≡ \frac{1}{\sqrt{2}}\left( \begin{array}{rr} 1 & 1 \\ 1 & -1 \\ \end{array} \right) $$

アダマールゲートは, 量子ビットを重ね合わせ状態にすることができるゲートです. アダマール変換とも呼称します. アダマールゲートは, フランス人Hadamardに因んで名付けられました. フランス語で頭文字のHと最後のDは発音しないので, ハダマードではなくアダマールと呼びます.

$$ H\ket{0}=\frac{1}{\sqrt{2}}\left( \begin{array}{rr} 1 & 1 \\ 1 & -1 \\ \end{array} \right) \left( \begin{array}{r} 1 \\ 0 \\ \end{array} \right) =\frac{1}{\sqrt{2}} \left( \begin{array}{r} 1 \\ 1 \\ \end{array} \right) $$ $$ H\ket{1}=\frac{1}{\sqrt{2}}\left( \begin{array}{rr} 1 & 1 \\ 1 & -1 \\ \end{array} \right) \left( \begin{array}{r} 0 \\ 1 \\ \end{array} \right) =\frac{1}{\sqrt{2}} \left( \begin{array}{r} 1 \\ -1 \\ \end{array} \right) $$

ここで

$$ \frac{1}{\sqrt{2}} \left( \begin{array}{r} 1 \\ 1 \\ \end{array} \right)=\frac{\ket{0}+\ket{1}}{\sqrt{2}} $$

であり, これは量子ビットを観測するとそれぞれ$\left( \frac{1}{\sqrt{2}} \right) ^2=\frac{1}{2}$の確率で状態$\ket{0}$, $\ket{1}$という結果を得ることができる重ね合わせの状態です.

量子回路上では以下のように表現します. f:id:lyncs:20171215230556p:plain

位相シフトゲート

$$ S ≡ \left( \begin{array}{rr} 1 & 0 \\ 0 & i \\ \end{array} \right)  S^\dagger ≡ \left( \begin{array}{rr} 1 & 0 \\ 0 & -i \\ \end{array} \right) $$ $$ T ≡ \left( \begin{array}{rr} 1 & 0 \\ 0 & exp(i\frac{\pi}{4}) \\ \end{array} \right)  T^\dagger ≡ \left( \begin{array}{rr} 1 & 0 \\ 0 & exp(-i\frac{\pi}{4}) \\ \end{array} \right) $$

位相シフト演算は, 任意の重ね合わせ状態に対して適用すると, $\ket{0}$には何も操作を行わず, $\ket{1}$にのみ位相の操作を行います. 将来的には位相の角度を指定して様々な位相シフトゲートを作ることができることが望まれていますが, 今回操作する予定のIBM Qでは二つの角に対応した$S,T$とその反転の$S^\dagger, T^\dagger$が実装されています.

$$ S\ket{x}= \left( \begin{array}{rr} 1 & 0 \\ 0 & i \\ \end{array} \right) \left( \begin{array}{r} a\\ b\\ \end{array} \right) =a\ket{0}+ib\ket{1} $$ $$ T\ket{x}= \left( \begin{array}{rr} 1 & 0 \\ 0 & exp(i\frac{\pi}{4}) \\ \end{array} \right) \left( \begin{array}{r} a\\ b\\ \end{array} \right) =a\ket{0}+exp(i\frac{\pi}{4})b\ket{1} $$

位相シフト演算$S^\dagger$と$T^\dagger$は, 元の$S$,$T$シフト演算の逆向きの回転になっています. よって, $SS^\dagger=I$, $TT^\dagger=I$となっています.

f:id:lyncs:20171215232636p:plain

CNOTゲート

$$ CNOT^{(c,t)}≡ \left( \begin{array}{rrrr} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ \end{array} \right) $$

CNOT(controll-NOT)ゲートは, 2つの量子をもつれさせるゲートです. 今までのゲートが単一量子ビット演算子(素子)だったのに対し, CNOTゲートは2量子ビットを必要とします. 基本的にはビット反転演算子Xを実行することができるゲートですが, この時別の量子ビットによって制御されていることが特徴です. NOT演算子(Xゲート)を制御することから, 制御NOTゲートとも呼ばれます.

CNOTゲートの実行には, 制御(controll)量子ビット$\ket{c}$と標的(target)量子ビット$\ket{t}$の二つが必要です. そして, 制御量子ビットが$\ket{0}$ならば何もせず, $\ket{1}$ならばXゲート(ビット反転)を実行します.

$$ CNOT\ket{00}=\ket{00}  CNOT\ket{01}=\ket{01} $$ $$ CNOT\ket{10}=\ket{11}  CNOT\ket{11}=\ket{10} $$

量子回路上では以下のように表現します. 十字になっているのが標的量子ビットで, 小さな塗りつぶされた丸が制御量子ビットです.

f:id:lyncs:20171215230710p:plain

ここで, 先ほどの量子もつれの説明ででてきたBell pairの一つ,$\ket{Φ^+}$を生成してみましょう. Bell pairは,アダマールゲートとCNOTゲートを使えばすぐに生成できます.

f:id:lyncs:20171215230638p:plain

この時,二つの量子ビットはどのような行列の式で表現できるのでしょうか. 答えは, 一つの量子ビットは当然アダマールを適用するとして, もう一つの何もしない量子ビットに対しては,「何もしない」量子ゲートを適用したことにすればいいのです.「何もしない」量子ゲートは, 最初に説明したゲート, 恒等演算子(Id)のことでした. それを元に最初の段階の操作を式にすると以下のようになります.

ここで, 二つの量子に別の量子ゲートを適用した場合, 操作をテンソル積を用いることでひとつの式にまとめることができます.(このためにわざわざ「何もしない」操作の式を立てたのです.)このまとめたテンソル積を, クロネッカー積と呼称します.

$$H\otimes I$$ $$=\frac{1}{\sqrt{2}}\left( \begin{array}{rr} 1 & 1 \\ 1 & -1 \\ \end{array} \right)\otimes\left( \begin{array}{rr} 1 & 0 \\ 0 & 1 \\ \end{array} \right) $$ $$=\frac{1}{\sqrt{2}}\left( \begin{array}{rr} 1\left( \begin{array}{rr} 1 & 0 \\ 0 & 1 \\ \end{array} \right) & 1\left( \begin{array}{rr} 1 & 0 \\ 0 & 1 \\ \end{array} \right) \\ 1\left( \begin{array}{rr} 1 & 0 \\ 0 & 1 \\ \end{array} \right) & -1\left( \begin{array}{rr} 1 & 0 \\ 0 & 1 \\ \end{array} \right) \\ \end{array} \right) $$ $$ =\frac{1}{\sqrt{2}}\left( \begin{array}{rrrr} 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 \\ 1 & 0 & -1& 0 \\ 0 & 1 & 0 & -1 \\ \end{array} \right) $$

ここまでくれば, あとはCNOTを適用するだけです.

観測

今まで説明してきたように, 量子ビットは重ね合わせやもつれの状態にすることが可能ですが, 量子ビットを観測すると状態が確定し, 重ね合わせや量子もつれは壊れてしまい, 古典ビットになります. 観測は以下のようなアイコンで表現します.

f:id:lyncs:20171215230736p:plain

この図では, 第四量子ビットを測定し, 値(古典ビット)が得られるということを示しています.

IBM Qの使い方

IBMクラウド上に誰でも無料で動かせる量子コンピュータを「IBM Quantum Experience」として公開しています. この量子コンピュータの本体はIBMのニューヨークの研究施設にあり, 利用者が命令を送るたびに実際に超電導回路で量子ビットを生成, 操作してくれます.

f:id:lyncs:20171215230813j:plain
IBMQ

現在すぐに誰でも動かせる量子コンピュータは, IBM qx2, qx4, qx5の3種類です. これらが扱うことのできる量子ビットは,それぞれ5,5,17量子ビットです. qx5のみBeta版で,webサイト上のGUI(グラフィカルユーザインターフェース)に対応していないので今回は説明を省きます. qx2,qx4に関してはGUIが実装されており, 量子回路のグラフィックをいじることで量子コンピュータに行って欲しい命令を伝えることができます.

f:id:lyncs:20171217004528p:plain
利用可能な量子コンピュータ

ただし, 量子コンピュータ量子もつれを生成するのには少し制限があります. 例えば, IBM qx4の設定を見ると以下のような図が表示されています.

f:id:lyncs:20171215230905p:plain

この図は, トポロジーと呼ばれるもので, 量子もつれ(CNOTゲート)に関する制限が書かれています. 読み方としては, 丸に囲まれたQ0からQ4が使用可能な量子ビットを表しています. 先ほど述べたようにqx4は5量子ビット使用可能なので, Q0,1,2,3,4の5つが表示されています. 各矢印は, 量子もつれ状態を生成可能(CNOTゲートを使用可能)であることを示しています. 矢印の方向は,コントロール量子ビット→ターゲット量子ビットになっています. なので, 例えばQ2の量子ビットは, CNOTゲートを用いるとき, Q3をコントロール量子ビットとしてターゲット量子ビットになることができ, また自身をコントロール量子ビットとしてQ0,1,4をターゲット量子ビットとすることができます.

IBMQはZ測定のみに対応していますが,ブロッホ球の回転操作を行うことによってX測定,Y測定に近い測定を行うことができます.これは,以下のような量子回路で実行できます. ただし,それぞれの操作によるノイズの発生があるので, より厳密な議論では注意が必要です.

f:id:lyncs:20171215232703p:plain

IBM Qを動かしてみる

実際にIBM qx4で動かしてみましょう. 現在の量子コンピュータでは計算を行うごとにノイズが発生しますが, それがどれだけ計算に影響を与えているか知ることができます. ノイズは, 量子ビットが物理的に存在するにあたって完全に閉じた系にすることが難しいことに起因しています. (量子コンピュータ外部からの振動や電磁波, 観測機器の故障や精度限界など様々な要因が考えられます.)

IBM Qの操作

IBM Qは, 量子回路の読み方がわかれば, 極めて簡単に量子ビットを操作することができるようなGUIが実装されています. ここまでの説明で量子回路の基礎は抑えたので, 早速動かしてみましょう.

まず, https://www.research.ibm.com/ibm-q/をwebブラウザで開いてください. すると以下のような画面が出てきます. f:id:lyncs:20171217004901p:plain

開けたら, 右側のExperimentに入り,"Start experimenting with a quantum computer"をクリックして開いてください. 次に, ページの右上にある"Sign In"をクリックしてください.メールアドレスを登録するか,IBM Id, Linkedin, Github, Google, Twitterなどのアカウントでログインができます.

Sign inするとCommunityのForumが表示されるので, 右上のメニューの"composer"を選択してください. 先ほど少し紹介したトポロジーが表示されるので下に行くと, 楽譜のようなものがあります. これが量子回路になっており, 右側に見える量子ゲートをマウスでドラッグ&ドロップすることで行いたい操作を設定できます. なお, 楽譜に似ているのでこの量子回路を"Composer"と称することがあります.

f:id:lyncs:20171215225941p:plain

実行したい回路の作成が終わったら, 回路の右上のRunかSimulateをクリックしましょう.

Runを押すと実際の量子コンピュータを動かすことができ, Simulateをクリックすると, 古典コンピュータで量子コンピュータをシミュレートしたものを動かすことができます. 古典コンピュータによるシミュレータは, 実際の量子コンピュータと違ってノイズがほぼ全くない理想的な状態の計算を行うことができます(このことをフィデリティがほぼ1である、と呼称します). なお,現状の技術では量子ビット数が非常に少ないので古典コンピュータによるシミュレートが可能ですが, 今後量子ビット数が増えるにつれ, 古典コンピュータによるシミュレートが不可能になる(処理が追いつかなくなる)ことが明確に予測されています.

"Run"すると, 数時間から数日ほどしてから計算結果(量子の観測結果)がメールで届きます. ただし, すでに同じ回路を実行した人がいた場合, 過去の観測データを待たずに見ることもできます.また, 右上の”save”から自分の作った量子回路を保存することができます.

最近のニュース

IBMは, 2017年11月, 20量子ビット量子コンピュータの作成に成功したと発表しました. (12/15に利用開始)また、それを活用した50量子ビットのチップのプロトタイプも完成しているようです. 20量子ビットのものは, IBMQネットワークのメンバー(慶應義塾など)や一部企業はクラウド利用可能です. 20量子ビットのものはトポロジーが公開されていますが, 双方向のトポロジーになっており, 大変利便性が向上していると言えるでしょう.

最後に

最後まで読んで頂き, ありがとうございました. ご意見, ご指摘などございましたらお気軽にツイッター(@shin_tsujido)までご連絡下さい.

|つじしん〉 (@shin_tsujido) | Twitter

今回は誌面の都合もあり, 量子回路を用いたアルゴリズムなどを紹介することはできませんでしたが, 次回以降アップデートしていきたいと思っております. 【12/23追記】 トポロジーのことをトモグラフィーと誤記していたため修正。 【12/25追記】 アダマールゲート、位相シフトゲートの式に符号の欠落が見られたため修正

参考文献


  1. 石坂 智, 小川 朋宏, 河内 亮周, 木村 元, 林 正人 『量子情報科学入門』(2012)

  2. ロイター『量子コンピューター、来年度予算に32億円 米国先行に危機感』 (2017)

  3. 古田 彩 https://twitter.com/ayafuruta/status/924051215314403328 (2017)

  4. 中山 茂 『クラウド量子計算入門 IBMの量子シミュレーションと量子コンピュータ』(2016)

三田祭告知・会誌の発行について

慶應義塾大学三田キャンパスのお祭り、三田祭が近づいてきました。

Twitterの方でも順次告知しておりますが、今年もLYNCSは三田祭に参加致します。 出展内容は以下の通りです。

  • 自作ドームでのプラネタリウム展示・生解説
  • 天体写真ポストカードの販売
  • 会誌「Escape Velocity」無料頒布

Escape Velocity

LYNCS初の試みとして、各部門からの寄稿をまとめた会誌を発行します。 団体全体として印刷物を公開するのは初めてであり、混乱も多々ありましたが、会員の協力で三田祭合わせでの発行が実現しました。

以下、掲載した記事の一覧です。

  1. 代表挨拶
  2. 量子情報科学序論~IBM Qを動かして学ぶ量子コンピュータ
  3. LYNCS理学研究本部 線型代数ゼミノート
  4. 2017種子島ロケットコンテスト
  5. 天文研究本部活動紹介
  6. LYNCS会員の機材紹介
  7. 星景・天体写真の撮り方
  8. 望遠鏡の紹介・扱い方
  9. LYNCS会員入会理由語り

希望される方には無料でお配りしますので、お近くの会員にお声掛けください。

皆様のご来場心よりお待ちしています。

(広報・И)

第13回能代宇宙イベント ~結果と3年間の感想~

f:id:lyncs:20170901074813j:plain 皆様お久しぶりです.代表のあっきーです.
先月8月17日~21日で第13回能代宇宙イベントのCanSat部門に出場してきました.
Twitterで実況や感想ツイートを行ってきましたが,このブログで結果をご報告させていただきます.

続きを読む

mbed / Raspberry Pi 用のBSch3V用部品データ (Win/Mac対応)

回路図エディタ「BSch3V」を使用していると、意外と最近のマイコンボードの部品データがなかったり、あったとしてもリンクが消滅しているといった事態に悩まされます。ということで作りました。

最近のマイコンボードといっても無限にありますので、とりあえず弊団体で使用しているmbedの主要なボード(LPC1768など)やRaspberry PiのGPIOピンをデータ化しています。もしご要望などありましたらコメント頂けると対応できるかもしれません。

また、Mac版のQt-BSch3V Modifiedでも利用できることを確認しております。

ダウンロード

BSch3V_mbed_raspberrypi.zip - Google ドライブ

(ryo-a)