<jupyter_start><jupyter_text>Week0: IBM Quantum Challenge 基礎の学習 本学習は初心者向けに、まずは量子回路をつかった演算の基礎を学ぶことを目的としています。すでに内容を理解されている方は、この教材は飛ばしていただいてかまいません。（当ドキュメントは、Qiskit Textbookの[The atoms of computation](https://qiskit.org/textbook/ch-states/atoms-computation.html)を元に作成しました。）  量子計算とは？古典計算との比較量子コンピューターのプログラミングは、今では誰もが自宅から快適におこなうことができます。でも、何をどうやってつくるのでしょうか？そもそも量子プログラムとは？量子コンピューターとは何でしょうか？これらの疑問は、今日の標準のデジタルコンピューターと比較することで回答できます。この記事では、まずはデジタルコンピューターの基本原則から見ていきます。その後、量子コンピューティングの話にスムーズに移行できるよう、量子コンピューティング上での計算を行うときと同じツールを使用して実行します。  すべての情報はビットであるビットは世の中のありとあらゆる情報を0または1で表現する情報の最小単位のことです。例えば、私たちが日常的に使用する十進数記法の数字は0, 1, 2, 3, 4, 5, 6, 7, 8. 9の10個の数字の組合せで表現します。各位の値は10の累乗をそれぞれいくつ含んでいるのかを表しています。例として **9213** という数字をみてみましょう。この数字は9000 + 200 + 10 + 3に分解できます。0~9までの各数字に対して、10の累乗をそれぞれいくつ含んでいるのかをみてみますと、**9213** = **9 x 103 + 2 x 102 + 1 x 101+ 3 x 100** として表現できます。 つづいて、同じ数字を二進数をベースに分解してみましょう。0と1の数字に対して、2の累乗をそれぞれいくつ含んでいるかをみてみますと、**9213 = 1 x 213 + 0 x 212 + 0 x 211 + 0 x 210 + 1 x 29 + 1 x 28 + 1 x 27 + 1 x 26 + 1 x 25 + 1 x 24 + 1 x 23 + 1 x 22 + 0 x 21 + 1 x 20** に分解することができることから、9213という数字はバイナリで表現すると **10001111111101** になります。 任意の数だけではなく、こちらの[テーブル](https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/network/conversion_table.html)にあるように、様々な文字や記号も0と1のバイナリで表すことができます。この対応表は業界の標準として広く採用されており、この記事がインターネットを通じて読者である皆さんに届けられる際にも用いられています。私たちが知っているコンピューターが扱うすべての情報（e.g. 数字、文字、画像、音声, etc.)は、実はこうしたビット列のかたまりであることを改めて覚えておきましょう。  8-bitのコンピューターをIBM Quantum Experienceでつくってみよう 量子回路を作成して実行するためのツールにIBM Quantum Experienceがあります。GUIが五線譜に似ていることから、通称Composerとも呼ばれています。このCircuit Composerをつかって8-bitのコンピューターをつくってみましょう。 1. (まだお済みでない方は)IBM Quantum Experienceのページから[アカウント作成](https://quantum-computing.ibm.com/)を行います。2. 中央のStart a new circuitボタンを押してCircuit Composerをたちあげます。（または[こちら](https://quantum-computing.ibm.com/composer/new-experiment)からもComposerにアクセスできます。）3. 量子ゲートを直接ドラッグ&ドロップして回路を構築できます。4. 右側のCode editorを直接編集して回路を構築することも可能です。<jupyter_code>from IPython.display import Image, display
Image('composer01.jpg')<jupyter_output><empty_output><jupyter_text>では、量子レジスタと古典レジスタをそれぞれ8個用意して(i.e. qreg[8], creg[8] )、測定用のオペレーター（メーター模様の灰色のゲート）を各量子ビットからのびている線に順番に配置してみましょう。（上手にできなかった場合は、[こちら](https://quantum-computing.ibm.com/composer/new-experiment?initial=N4IgdghgtgpiBcICqYAuBLVAbGATABAMboBOhArpiADQgCOEAzlAiAPIAKAogHICKAQQDKAWXwAmAHQAGANwAdMOjCEs5XDHzz6MLOgBGARknLC2hWEV0SMAOb46AbQAcAXQuEb9wi-eLFsEzkNg6O0q74ALQAfERhfmCBjMGaToYRMXHpFkkpoeIZsT4FOTBBIU4AzIVx1aXlqY4ALDU%2BLfXJFY4ArK09CbldAGx9Ix15TgDsfdOyNCAajJ7oAA4YAPZgrCAAvkA)をご参照ください。）<jupyter_code>Image('composer02.jpg')<jupyter_output><empty_output><jupyter_text>この図で示されているのが、「回路」と呼ばれるものです。回路は線の左から右へと時間発展的に量子ビットの状態を操作するものですが、私たちに馴染みのある古典コンピューターの論理回路も量子回路をつかって同じようにつくることができます。ここの例では大したことは起きていません。8個の量子ビットが準備され、それぞれ0から7番目までの番号が割り振られています。各量子ビットに「測定」のオペレーションが適用されており、この「測定」によって'0'または'1'の値が読み取られます。 量子ビットは常に0の状態を取るよう初期化されます。そのため、上記回路のように「測定」以外何もしないときは、すべての測定結果は当然'0'になります。Composer下側のタブで'Measurement Probabilities'をドロップダウンから選んでください。すると、下記のようなヒストグラムが表示され、すべての量子ビットが'0'を返している様子 (i.e. '00000000')を確認することができます。<jupyter_code>Image('histogram01.jpg',width="300", height="200")<jupyter_output><empty_output><jupyter_text>'0'以外のビットをエンコードするには、NOTゲートを使います。コンピューターの演算において最も基本的なオペレーションであるNOTゲートは'0'を'1'に、'1'を'0'に反転します。Circuitでこれを適用するには、表示されている量子ゲートの中から、$\oplus$と表示されている紺色のアイコンを選んで五線譜の上にドラッグ&ドロップします。（ぜひご自分でトライしていただきたいですが、操作に困った場合は[こちら](https://quantum-computing.ibm.com/composer/new-experiment?initial=N4IgdghgtgpiBcICqYAuBLVAbGATABAMboBOhArpiADQgCOEAzlAiAPIAKAogHICKAQQDKAWXwAmAHQAGANwAdMOjCEs5XDHzz6MLOgBGARknLC2hWEV0SMAOb46AbQAcAXQuEb9wi-eLFAB4OjgDsfmCwTOQ2wdKu%2BAC0AHxEjnEWkYzRmk6G8cmpeRkwUTFO4vkpPhXFpTmOAMyVqU21WWWOACzNPt1t2cEArD2Ow-0dAGwjU%2BP1YYlVoe40IBqMnugADhgA9mCsIAC%2BQA)をご参照ください。）<jupyter_code>Image('composer03.jpg')<jupyter_output><empty_output><jupyter_text>さきほどのヒストグラムが、今度は'10000000'を出力しているのが確認できます。この回路は8-bitのコンピューターと同じです。<jupyter_code>Image('histogram02.jpg',width="300", height="200")<jupyter_output><empty_output><jupyter_text>ここで反転させているビットは、量子ビット7番に対してであることにもう一度着目してください。そして出力されたビット列の一番左がそれに対応して'1'に反転しています。(i.e., '10000000') つまり、Circuit Composerでは番号の大きい量子ビットほど高い位のビット数に対応しています。こうすることで、7番目の量子ビットは27がいくつあるのか、6番目の量子ビットは26がいくつあるのか、5番目の量子ビットは25がいくつあるのか、という具合に、量子ビットで数を表現しやすくなります。ここでは7番目の量子ビットを反転させて'1'にすることで、27 = 128をこの8-bitコンピューター上で表現することができました。（量子計算に関する他のサイトや教科書では、逆の表記方法を提示していることも多くありますが、上記表記法は量子ビットで整数値のバイナリ表現を行う上でメリットがあるため、Circuit Composerを使っているときは番号の大きな量子ビット＝高い位のビット数と覚えておきましょう。）  任意の数値を同じ回路でエンコードしてみよう さて、ここで任意の整数をエンコードしてみましょう。その数字がバイナリではどのように表現されるのかは検索して予め確認しておきましょう。（もし結果に'0b'が含まれていた場合はその2桁は切り捨てて左側に'0'を足して全体を8桁にしましょう。）以下は'34'を入力値としてエンコードした場合の回路です。5番目の量子ビットと1番目の量子ビットを反転しています。（i.e. 34 = 1 x 25 + 1 x 21) ぜひご自分で回路作成にトライしていただきたいですが、操作に困った場合は[こちら](https://quantum-computing.ibm.com/composer/new-experiment?initial=N4IgdghgtgpiBcICqYAuBLVAbGATABAMboBOhArpiADQgCOEAzlAiAPIAKAogHICKAQQDKAWXwAmAHQAGANwAdMOjCEs5XDHzz6MLOgBGARknLC2hWEV0SMAOb46AbQAcAXQuEb9wi-eLFAB4OjoZ%2BYEFOAKxhsEzkNsHSrvgAtAB8RI5JFrGM8ZpOoakZPqE5MHEJTuLJ6Zk15ZUFjgDMtSWtMRV5VY4ALO2ZA409zdHFmdEj%2BcEAbIM%2B89O9AOwLjmuyNCAajJ7oAA4YAPZgrCAAvkA)をご参照ください。<jupyter_code>Image('composer04.jpg',width="600", height="400")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09458933437135073, 'fraction_numerical': 0.06305955624756715, 'mean_word_length': 19.23228346456693, 'pattern_counts': {'":': 0, '<': 25, '<?xml version=': 0, '>': 25, 'https://': 7, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 4, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '285655', 'license': 'MIT', 'n_tokens_mistral': 4079, 'n_tokens_neox': 3590, 'n_words': 137, 'path': 'challenges/ibm-quantum/iqc-fall-2020/week-0/ex_0_ja.ipynb', 'repo_name': 'devang-gajjar/quantum-computing', 'size': '5138'}