{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# QOSF screening challenge\n", "https://www.qosf.org/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "2020-09-10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "by [Kunal Marwaha](https://kunalmarwaha.com/about)" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "Task 2\n", "Implement a circuit that returns |01> and |10> with equal probability.\n", "Requirements :\n", "The circuit should consist only of CNOTs, RXs and RYs. \n", "Start from all parameters in parametric gates being equal to 0 or randomly chosen. \n", "You should find the right set of parameters using gradient descent (you can use more advanced optimization methods if you like). \n", "Simulations must be done with sampling - i.e. a limited number of measurements per iteration and noise. \n", "\n", "Compare the results for different numbers of measurements: 1, 10, 100, 1000. \n", "\n", "Bonus question:\n", "How to make sure you produce state |01> + |10> and not |01> - |10> ?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Getting started" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is my first time using qiskit, but I'll give it a go." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I know how to turn $|00\\rangle$ into an equal combination of $|01\\rangle$ and $|10\\rangle$, but it uses a Hadamard gate." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from qiskit import *\n", "from qiskit.visualization import plot_histogram\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
┌───┐┌───┐ \n", "q_0: ┤ X ├┤ H ├──■──\n", " ├───┤└───┘┌─┴─┐\n", "q_1: ┤ X ├─────┤ X ├\n", " └───┘ └───┘" ], "text/plain": [ " ┌───┐┌───┐ \n", "q_0: ┤ X ├┤ H ├──■──\n", " ├───┤└───┘┌─┴─┐\n", "q_1: ┤ X ├─────┤ X ├\n", " └───┘ └───┘" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "qc_with_h = QuantumCircuit(2)\n", "qc_with_h.x(0)\n", "qc_with_h.x(1)\n", "qc_with_h.h(0)\n", "qc_with_h.cx(0, 1)\n", "qc_with_h.draw()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/kunal/anaconda3/lib/python3.7/site-packages/matplotlib/transforms.py:796: ComplexWarning: Casting complex values to real discards the imaginary part\n", " points = np.array(args, dtype=float).reshape(2, 2)\n" ] }, { "data": { "text/plain": [ "Text(0.5, 1.0, 'Probability weights in state vector')" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "