Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions dev_tools/qualtran_dev_tools/notebook_specs.py
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,8 @@
bloq_specs=[
qualtran.bloqs.gf_arithmetic.gf2_multiplication._GF2_MULTIPLICATION_DOC,
qualtran.bloqs.gf_arithmetic.gf2_multiplication._MULTIPLY_BY_CONSTANT_MOD_DOC,
qualtran.bloqs.gf_arithmetic.gf2_multiplication._MULTIPLY_POLY_BY_ONE_PLUS_XK_DOC,
qualtran.bloqs.gf_arithmetic.gf2_multiplication._BINARY_POLYNOMIAL_MULTIPLICATION_DOC,
],
),
NotebookSpecV2(
Expand Down
2 changes: 2 additions & 0 deletions qualtran/bloqs/gf_arithmetic/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
from qualtran.bloqs.gf_arithmetic.gf2_addition import GF2Addition
from qualtran.bloqs.gf_arithmetic.gf2_inverse import GF2Inverse
from qualtran.bloqs.gf_arithmetic.gf2_multiplication import (
BinaryPolynomialMultiplication,
GF2Multiplication,
GF2MultiplyByConstantMod,
MultiplyPolyByOnePlusXk,
)
from qualtran.bloqs.gf_arithmetic.gf2_square import GF2Square
245 changes: 243 additions & 2 deletions qualtran/bloqs/gf_arithmetic/gf2_multiplication.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -289,16 +289,257 @@
"show_call_graph(gf2_multiply_by_constant_modulu_g)\n",
"show_counts_sigma(gf2_multiply_by_constant_modulu_sigma)"
]
},
{
"cell_type": "markdown",
"id": "0b276213",
"metadata": {
"cq.autogen": "MultiplyPolyByOnePlusXk.bloq_doc.md"
},
"source": [
"## `MultiplyPolyByOnePlusXk`\n",
"Out of place multiplication of $(1 + x^k) fg$\n",
"\n",
"Applies the transformation\n",
"$$\n",
"\\ket{f}\\ket{g}\\ket{h} \\rightarrow \\ket{f}{\\ket{g}}\\ket{h \\oplus (1+x^k)fg}\n",
"$$\n",
"\n",
"Note: While this construction follows Algorithm2 of https://arxiv.org/abs/1910.02849v2,\n",
"it has a slight modification. Namely that the original construction doesn't work in\n",
"some cases where $k < n$. However reversing the order of the first set of CNOTs (line 2)\n",
"makes the construction work for all $k \\leq n+1$.\n",
"\n",
"#### Parameters\n",
" - `n`: The degree of the polynomial ($2^n$ is the size of the galois field).\n",
" - `k`: An integer specifing the shift $1 + x^k$ (or $1 + 2^k$ for galois fields.) \n",
"\n",
"#### Registers\n",
" - `f`: The first polynomial.\n",
" - `g`: The second polyonmial.\n",
" - `h`: The target polynomial. \n",
"\n",
"#### References\n",
" - [Space-efficient quantum multiplication of polynomials for binary finite fields with sub-quadratic Toffoli gate count](https://arxiv.org/abs/1910.02849v2). Algorithm 2\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9949a24e",
"metadata": {
"cq.autogen": "MultiplyPolyByOnePlusXk.bloq_doc.py"
},
"outputs": [],
"source": [
"from qualtran.bloqs.gf_arithmetic import MultiplyPolyByOnePlusXk"
]
},
{
"cell_type": "markdown",
"id": "dd7c9a74",
"metadata": {
"cq.autogen": "MultiplyPolyByOnePlusXk.example_instances.md"
},
"source": [
"### Example Instances"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ad918c9f",
"metadata": {
"cq.autogen": "MultiplyPolyByOnePlusXk.multiplypolybyoneplusxk"
},
"outputs": [],
"source": [
"n = 5\n",
"k = 3\n",
"multiplypolybyoneplusxk = MultiplyPolyByOnePlusXk(n, k)"
]
},
{
"cell_type": "markdown",
"id": "aa939469",
"metadata": {
"cq.autogen": "MultiplyPolyByOnePlusXk.graphical_signature.md"
},
"source": [
"#### Graphical Signature"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "648d128f",
"metadata": {
"cq.autogen": "MultiplyPolyByOnePlusXk.graphical_signature.py"
},
"outputs": [],
"source": [
"from qualtran.drawing import show_bloqs\n",
"show_bloqs([multiplypolybyoneplusxk],\n",
" ['`multiplypolybyoneplusxk`'])"
]
},
{
"cell_type": "markdown",
"id": "4bb8dcef",
"metadata": {
"cq.autogen": "MultiplyPolyByOnePlusXk.call_graph.md"
},
"source": [
"### Call Graph"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0890198e",
"metadata": {
"cq.autogen": "MultiplyPolyByOnePlusXk.call_graph.py"
},
"outputs": [],
"source": [
"from qualtran.resource_counting.generalizers import ignore_split_join\n",
"multiplypolybyoneplusxk_g, multiplypolybyoneplusxk_sigma = multiplypolybyoneplusxk.call_graph(max_depth=1, generalizer=ignore_split_join)\n",
"show_call_graph(multiplypolybyoneplusxk_g)\n",
"show_counts_sigma(multiplypolybyoneplusxk_sigma)"
]
},
{
"cell_type": "markdown",
"id": "9d9d1540",
"metadata": {
"cq.autogen": "BinaryPolynomialMultiplication.bloq_doc.md"
},
"source": [
"## `BinaryPolynomialMultiplication`\n",
"Out of place multiplication of binary polynomial multiplication.\n",
"\n",
"Applies the transformation\n",
"$$\n",
"\\ket{f}\\ket{g}\\ket{h} \\rightarrow \\ket{f}{\\ket{g}}\\ket{h \\oplus fg}\n",
"$$\n",
"\n",
"The toffoli cost of this construction is $n^{\\log_2{3}}$, while CNOT count is\n",
"upper bounded by $(10 + \\frac{1}{3}) n^{\\log_2{3}}$.\n",
"\n",
"#### Parameters\n",
" - `n`: The degree of the polynomial ($2^n$ is the size of the galois field). \n",
"\n",
"#### Registers\n",
" - `f`: The first polynomial.\n",
" - `g`: The second polyonmial.\n",
" - `h`: The target polynomial. \n",
"\n",
"#### References\n",
" - [Space-efficient quantum multiplication of polynomials for binary finite fields with sub-quadratic Toffoli gate count](https://arxiv.org/abs/1910.02849v2). Algorithm 3\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1ba3a057",
"metadata": {
"cq.autogen": "BinaryPolynomialMultiplication.bloq_doc.py"
},
"outputs": [],
"source": [
"from qualtran.bloqs.gf_arithmetic import BinaryPolynomialMultiplication"
]
},
{
"cell_type": "markdown",
"id": "296d193b",
"metadata": {
"cq.autogen": "BinaryPolynomialMultiplication.example_instances.md"
},
"source": [
"### Example Instances"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "907fcd25",
"metadata": {
"cq.autogen": "BinaryPolynomialMultiplication.binarypolynomialmultiplication"
},
"outputs": [],
"source": [
"n = 5\n",
"binarypolynomialmultiplication = BinaryPolynomialMultiplication(n)"
]
},
{
"cell_type": "markdown",
"id": "a100a193",
"metadata": {
"cq.autogen": "BinaryPolynomialMultiplication.graphical_signature.md"
},
"source": [
"#### Graphical Signature"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "aad80309",
"metadata": {
"cq.autogen": "BinaryPolynomialMultiplication.graphical_signature.py"
},
"outputs": [],
"source": [
"from qualtran.drawing import show_bloqs\n",
"show_bloqs([binarypolynomialmultiplication],\n",
" ['`binarypolynomialmultiplication`'])"
]
},
{
"cell_type": "markdown",
"id": "c1d23614",
"metadata": {
"cq.autogen": "BinaryPolynomialMultiplication.call_graph.md"
},
"source": [
"### Call Graph"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8dc799ef",
"metadata": {
"cq.autogen": "BinaryPolynomialMultiplication.call_graph.py"
},
"outputs": [],
"source": [
"from qualtran.resource_counting.generalizers import ignore_split_join\n",
"binarypolynomialmultiplication_g, binarypolynomialmultiplication_sigma = binarypolynomialmultiplication.call_graph(max_depth=1, generalizer=ignore_split_join)\n",
"show_call_graph(binarypolynomialmultiplication_g)\n",
"show_counts_sigma(binarypolynomialmultiplication_sigma)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python"
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.9"
}
},
"nbformat": 4,
Expand Down
Loading