{"id":312030,"date":"2020-10-26T09:00:40","date_gmt":"2020-10-26T09:00:40","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=312030"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=312030","title":{"rendered":"\u041a\u0430\u043a \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0430\u0443\u043a\u0430\u043c\u0438 \u0432 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/k3\/er\/5f\/k3er5fawrdg-ut5fw9joizgsuja.png\" alt=\"image\"><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0443\u0431\u0440\u0438\u043a\u0443 \u0442\u0435\u043c \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0432\u0438\u0434\u0430\u043d\u0438\u044f. \u041d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u0439 \u043f\u043e\u0432\u0435\u0441\u0442\u043a\u0435 \u0434\u043d\u044f \u2014 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c \u0434\u043b\u044f \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<blockquote><p>\u0414\u0430\u043b\u0435\u0435 \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0430\u0432\u0442\u043e\u0440\u0430<\/p><\/blockquote>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u0442\u044c \u043c\u043e\u0438\u0445 \u043d\u0430\u0441\u0442\u0430\u0432\u043d\u0438\u043a\u043e\u0432 <a href=\"https:\/\/github.com\/Roger-luo\" rel=\"nofollow\">\u0420\u043e\u0434\u0436\u0435\u0440\u0430 \u041b\u043e<\/a> \u0438 <a href=\"https:\/\/github.com\/GiggleLiu\" rel=\"nofollow\">\u0426\u0437\u0438\u043d\u044c\u0433\u043e \u041b\u044e<\/a> \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u043a\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043c\u0435\u043d\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f Google Summer of Code 2020. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 GSoC \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 Julia <a href=\"https:\/\/github.com\/QuantumBFS\/ZXCalculus.jl\" rel=\"nofollow\"><code>ZXCalculus.jl<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u044e \u0435\u0433\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c \u0438 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0432 <a href=\"https:\/\/github.com\/QuantumBFS\/YaoLang.jl\" rel=\"nofollow\"><code>YaoLang.jl<\/code><\/a> \u2014 DSL (\u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a) \u0434\u043b\u044f <a href=\"https:\/\/habr.com\/ru\/post\/493380\/\"><code>Yao.jl<\/code><\/a>. <code>Yao.jl<\/code> \u2014 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0439 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u0430\u043a\u0438\u043c\u0438 \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u041a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c &quot;Yao.jl&quot;, \u044f \u0440\u0430\u0434 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u0435\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435. \u0412 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435 \u044f \u043f\u043e\u0434\u044b\u0442\u043e\u0436\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<p>  <\/p>\n<h2 id=\"kvantovye-shemy-i-zx-ischislenie\">\u041a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u0438 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041a\u0432\u0430\u043d\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0438 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u0414\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e\u0439 \u0441\u0445\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u044b. \u041a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0432\u0435\u043d\u0442\u0438\u043b\u0438 \u041f\u0430\u0443\u043b\u0438, \u0410\u0434\u0430\u043c\u0430\u0440\u0430, T, CNOT.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0445 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u0441\u0445\u0435\u043c, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u0445\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0438\u0441\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0432 \u043f\u043b\u0430\u043d\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u043c\u0438 \u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f coQMA-\u0442\u0440\u0443\u0434\u043d\u043e\u0439 (\u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0439 \u0430\u043d\u0430\u043b\u043e\u0433 coNP) [1], [2]. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u044d\u0442\u043e, \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u0441\u0445\u0435\u043c. \u0412 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435 \u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044e \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u2014 <a href=\"https:\/\/en.wikipedia.org\/wiki\/ZX-calculus\" rel=\"nofollow\">ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u2014 \u044d\u0442\u043e \u0433\u0440\u0430\u0444, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0442\u0435\u043d\u0437\u043e\u0440\u043d\u044b\u0435 \u0438 \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/574\/33a\/a94\/57433aa94dc7c3c518b55509505361e8.svg\" alt=\"$ \\mathrm{CNOT}(2,3)\\cdot\\mathrm{CNOT}(1,2)\\cdot(H\\otimes I\\otimes I). $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/n-\/xw\/3o\/n-xw3ogkyerdxelkdkhylbruvsi.png\"><\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0441\u043e\u0431\u044b\u0439 \u0442\u0438\u043f \u0442\u0435\u043d\u0437\u043e\u0440\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. \u0412 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u043c\u044b \u0432\u0432\u043e\u0434\u0438\u043c \u0434\u0432\u0430 \u0432\u0438\u0434\u0430 \u0442\u0435\u043d\u0437\u043e\u0440\u043e\u0432: Z-\u043f\u0430\u0443\u043a\u043e\u0432 \u0438 X-\u043f\u0430\u0443\u043a\u043e\u0432. \u0422\u0435\u043d\u0437\u043e\u0440\u043d\u044b\u0435 \u0441\u0435\u0442\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0442\u0435\u043d\u0437\u043e\u0440\u043e\u0432, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u0432 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/4h\/ko\/qa\/4hkoqahelfszisap2-6kze8d3si.png\"><\/p>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e Z-\u043f\u0430\u0443\u043a\u043e\u0432 \u0438 X-\u043f\u0430\u0443\u043a\u043e\u0432, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bu\/gp\/ht\/bugphtbpc4ltr58epoatnmyveta.png\"><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u0445\u0435\u043c\u044b. \u0412 \u0440\u0430\u0431\u043e\u0442\u0435 [3] \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435 \u0441\u0445\u0435\u043c\u044b. <\/p>\n<p>  <\/p>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f GSoC 2020 \u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 \u0414\u0436\u0443\u043b\u0438\u0438 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445 \u044f \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  <\/p>\n<h2 id=\"cel-gsoc-proekta\">\u0426\u0435\u043b\u044c GSoC \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/h2>\n<p>  <\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043d\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Julia. \u0418 \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0430\u043a\u0435\u0442 Julia <code>ZXCalculus.jl<\/code>. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 Python-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, <a href=\"https:\/\/github.com\/Quantomatic\/pyzx\" rel=\"nofollow\"><code>PyZX<\/code><\/a>. \u041a\u0430\u043a \u0438 <code>PyZX<\/code>, <code>ZXCalculus.jl<\/code> \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c API \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u043d\u0430 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c \u0438\u0437 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c, \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <code>PyZX<\/code> \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 <code>ZXCalculus.jl<\/code>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u0443\u0435\u043c <code>ZXCalculus.jl<\/code> \u0432 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <a href=\"https:\/\/github.com\/QuantumBFS\/YaoLang.jl\" rel=\"nofollow\"><code>YaoLang.jl<\/code><\/a> \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412 <code>YaoLang.jl<\/code> \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0435 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f). \u042d\u0442\u0438 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 (Yao IR), \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u043d\u0430\u0440\u044f\u0434\u0443 \u0441 \u0444\u043e\u0440\u043c\u043e\u0439 SSA (\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f) \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u042d\u0442\u0438 \u0441\u0445\u0435\u043c\u044b \u0431\u0443\u0434\u0443\u0442 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>ZXCalculus.jl<\/code>. \u0417\u0430\u0442\u0435\u043c <code>YaoIR<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u0431\u044d\u043a\u0435\u043d\u0434-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a QASM \u0438\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 Yao.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0438\u043b\u0443\u0447\u0448\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0447\u0438\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Julia.<\/p>\n<p>  <\/p>\n<h2 id=\"metody\">\u041c\u0435\u0442\u043e\u0434\u044b<\/h2>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u042f \u0442\u0443\u0442 \u0431\u0443\u0434\u0443 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e.<\/p>\n<p>  <\/p>\n<h3 id=\"struktury-dannyh\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/h3>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c. ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0443\u043b\u044c\u0442\u0438\u0433\u0440\u0430\u0444 \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043e \u0435\u0433\u043e \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u0445. \u041a\u0430\u0436\u0434\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0447\u0435\u043c-\u0442\u043e \u0438\u0437 Z-\u043f\u0430\u0443\u043a\u043e\u0432, X-\u043f\u0430\u0443\u043a\u043e\u0432 \u0438\u043b\u0438 H-\u043a\u043e\u0440\u043e\u0431\u043e\u043a. \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0440\u0435\u0431\u0440\u0430. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 2 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0438\u0434\u0430 \u0432\u0435\u0440\u0448\u0438\u043d, \u0432\u0445\u043e\u0434\u043d\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0438 \u0432\u044b\u0445\u043e\u0434\u043d\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u044d\u0442\u0438\u0445 \u0440\u0435\u0431\u0435\u0440. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u0433\u0440\u0430\u0444\u043e\u0432. \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 &quot;Dict&quot;, \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0432\u0435\u0440\u0448\u0438\u043d.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">struct Multigraph{T&lt;:Integer} &lt;: AbstractMultigraph{T}     adjlist::Dict{T, Vector{T}} end<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0443\u043b\u044c\u0442\u0438\u0433\u0440\u0430\u0444\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0430\u0432\u0438\u043b ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0432\u0435\u0440\u0448\u0438\u043d. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>Dict<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>Array<\/code>. \u0415\u0449\u0435 \u0431\u044b\u0432\u0430\u044e\u0442 \u0444\u0430\u0437\u044b \u0434\u043b\u044f Z- \u0438 X-\u043f\u0430\u0443\u043a\u043e\u0432. \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0444\u0430\u0437. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">struct ZXDiagram{T&lt;:Integer, P} &lt;: AbstractZXDiagram{T, P}     mg::Multigraph{T}     st::Dict{T, SpiderType.SType}     ps::Dict{T, P}     ... end<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u044b \u0433\u0440\u0430\u0444\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b. \u041e\u043d\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0432 \u0441\u0435\u0431\u044f \u0442\u043e\u043b\u044c\u043a\u043e Z-\u043f\u0430\u0443\u043a\u043e\u0432 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0433\u0440\u0430\u043d\u0435\u0439: \u0430\u0434\u0430\u043c\u0430\u0440\u043e\u0432\u0441\u043a\u0438\u0435 \u0438 \u043d\u0435\u0430\u0434\u0430\u043c\u0430\u0440\u043e\u0432\u0441\u043a\u0438\u0435. \u041c\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0443\u043b\u044c\u0442\u0438\u0433\u0440\u0430\u0444\u044b \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0431\u0435\u0440 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0440\u0435\u0431\u0435\u0440. \u041c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c <code>ZXGraph<\/code> \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">struct ZXGraph{T&lt;:Integer, P} &lt;: AbstractZXDiagram{T, P}     mg::Multigraph{T}     st::Dict{T, SpiderType.SType}     ps::Dict{T, P}     ... end<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b.<\/p>\n<p>  <\/p>\n<h3 id=\"pravila-preobrazovaniy\">\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439<\/h3>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0432 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u0448\u0430\u0433\u0430: \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u0435 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u043b\u0430\u0433\u043e\u0441\u043b\u043e\u0432\u0435\u043d\u043d\u0443\u044e \u0434\u0436\u0443\u043b\u0438\u0430\u043d\u0441\u043a\u0443\u044e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e. API-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">match(r::AbstractRule, zxd::AbstractZXDiagram) rewrite!(r::AbstractRule, zxd::AbstractZXDiagram{T, P}, matches::Vector{Match{T}}) where {T, P}<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c <code>match<\/code> \u0432\u0435\u0440\u043d\u0435\u0442 \u0432\u0441\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">struct Match{T&lt;:Integer}     vertices::Vector{T} end<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 <code>rewrite!<\/code> \u2014 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u0432\u0441\u0435\u0445 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u0445. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0441\u0442\u0430\u0442\u044c \u043d\u0435\u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043b\u0438 \u0435\u0449\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">check_rule(r::AbstractRule, zxd::AbstractZXDiagram{T, P}, vs::Vector{T}) where {T, P}<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 <code>simplify!<\/code> \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">function simplify!(r::AbstractRule, zxd::ZXDiagram)     matches = match(r, zxd)     while length(matches) &gt; 0         rewrite!(r, zxd, matches)         matches = match(r, zxd)     end     return zxd end<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f [3], \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u0432 \u0433\u0440\u0430\u0444\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 i1, i2, h, \u0438 f. \u041f\u043e\u0441\u043b\u0435, \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u043c \u0433\u0440\u0430\u0444\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c \u0437\u0430\u043c\u0435\u0449\u0435\u043d\u0438\u044f. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0448\u0430\u0433\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c\u0438 \u0441\u043a\u0435\u043b\u0435\u0442\u0430\u043c\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0445\u0435\u043c\u043e\u0439. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u2014 \u044d\u0442\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c \u0438\u0437 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c.<\/p>\n<p>  <\/p>\n<h3 id=\"izvlechenie-shem\">\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c<\/h3>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u044b \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438. \u042f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e\u0439 \u0441\u0445\u0435\u043c\u044b. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0439 g-\u043f\u043e\u0442\u043e\u043a. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e g-\u043f\u043e\u0442\u043e\u043a\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u0441\u0435\u0445 \u043f\u0430\u0443\u043a\u043e\u0432. \u041f\u0440\u0430\u0432\u0438\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e. \u042d\u0442\u043e \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0441\u0445\u0435\u043c\u044b \u0438\u0437 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0445 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c. <\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043b\u044e\u0431\u0430\u044f \u0433\u0440\u0430\u0444\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u0430 \u043f\u043e CNOT + H. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u044d\u0442\u0438 \u0441\u0445\u0435\u043c\u044b CNOT \u0441 \u0433\u0430\u0443\u0441\u0441\u043e\u0432\u0441\u043a\u0438\u043c \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0430\u0434 $F_2$. \u0412\u043c\u0435\u0441\u0442\u0435 \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 H-, CZ-\u0433\u0435\u0439\u0442\u0430\u043c\u0438 \u0438 Z-\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0445\u0435\u043c\u0443, \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u0443\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439.<\/p>\n<p>  <\/p>\n<h3 id=\"demo\">Demo<\/h3>\n<p>  <\/p>\n<p>\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0432\u0437\u044f\u0442\u0430 \u0438\u0437 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a \u0441\u0442\u0430\u0442\u044c\u0435 [3]. \u0412\u0441\u0435 \u043a\u043e\u0434\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 <code>examples\\ex1.jl<\/code> \u0443 <code>ZXCalculus.jl<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\"># this is the original circuit. zxd = generate_example() ZXplot(zxd)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/1i\/wa\/tp\/1iwatp9fd8huhcbs44qk5mrxgyc.png\"><\/p>\n<p>  <\/p>\n<pre><code class=\"julia\"># convert a ZX-diagram to a graph-like ZXdiagram zxg = ZXGraph(zxd) ZXplot(zxg, linetype = &quot;curve&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wy\/ji\/pf\/wyjipf7tpyp9sj_cedie-4ht0_q.png\"><\/p>\n<p>  <\/p>\n<pre><code class=\"julia\"># simplify with local complementary rule  simplify!(Rule{:lc}(), zxg) ZXplot(zxg, linetype = &quot;curve&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cg\/zr\/7m\/cgzr7mzy65movan2qtkspnbqcs8.png\"><\/p>\n<p>  <\/p>\n<pre><code class=\"julia\"># simplify with pivoting rule simplify!(Rule{:p1}(), zxg) ZXplot(zxg, linetype = &quot;curve&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cg\/zr\/7m\/cgzr7mzy65movan2qtkspnbqcs8.png\"><\/p>\n<p>  <\/p>\n<pre><code class=\"julia\"># removing all Paulis adjancent to boundaries replace!(Rule{:pab}(), zxg) ZXplot(zxg, linetype = &quot;curve&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/zz\/yu\/fv\/zzyufvcpxcejuwmxjs22t0hhzki.png\"><\/p>\n<p>  <\/p>\n<pre><code class=\"julia\"># extract circuit cir = circuit_extraction(zxg) ZXplot(cir)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/t4\/n6\/f7\/t4n6f7h5aev19ql8cza0gwgxd7e.png\"><\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443.<\/p>\n<p>  <\/p>\n<ul>\n<li>[1]: <a href=\"https:\/\/www.worldscientific.com\/doi\/abs\/10.1142\/S0219749905001067\" rel=\"nofollow\">&quot;NON-IDENTITY-CHECK&quot; IS QMA-COMPLETE<\/a><\/li>\n<li>[2]: <a href=\"https:\/\/arxiv.org\/abs\/0903.0675\" rel=\"nofollow\">Exact Non-identity check is NQP-complete<\/a><\/li>\n<li>[3]: <a href=\"https:\/\/arxiv.org\/abs\/1902.03178\" rel=\"nofollow\">Graph-theoretic Simplification of Quantum Circuits with the ZX-calculus<\/a><\/li>\n<li>[4]: <a href=\"https:\/\/arxiv.org\/abs\/1903.10477\" rel=\"nofollow\">Reducing T-count with the ZX-calculus<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h3 id=\"metaprogrammirovanie-kvantovaya-kompilyaciya-i-optimizaciya-shem-pri-kvantovoy-kompilyacii\">\u041c\u0435\u0442\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0445\u0435\u043c \u043f\u0440\u0438 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/h3>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u043c\u0435\u0441\u044f\u0446\u0435 \u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430\u0434 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u0441 <code>YaoLang.jl<\/code> \u0434\u043b\u044f <code>ZXCalculus.jl<\/code>. \u042d\u0442\u043e \u0431\u044b\u043b \u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0435\u0442\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0414\u0436\u0443\u043b\u0438\u0438 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u042f \u0445\u043e\u0447\u0443 \u043f\u043e\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0430\u0432\u043d\u0438\u043a\u0430 \u0420\u043e\u0434\u0436\u0435\u0440\u0430 \u041b\u043e \u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u043d\u0430\u0443\u0447\u0438\u043b \u043c\u0435\u043d\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u044f\u043c \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u043c\u0435\u0442\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Metaprogramming\" rel=\"nofollow\">\u0412\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>, <em>\u043c\u0435\u0442\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u043c\u0435\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u0430\u043a \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435.<\/em> \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043c\u0435\u0442\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 Julia, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Julia.<\/p>\n<p>  <\/p>\n<h3 id=\"kak-julia-rabotaet\">\u041a\u0430\u043a Julia \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u043a\u043e\u0434\u044b \u0414\u0436\u0443\u043b\u0438\u0438 \u043f\u043e \u0441\u0443\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 (<code>Strings<\/code>), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043a\u0435. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u0434\u044b Julia, \u0414\u0436\u0443\u043b\u0438\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Abstract_syntax_tree\" rel=\"nofollow\">AST (\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f)<\/a>. AST \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 <code>Expr<\/code> \u0432 Julia. \u041d\u0430 \u044d\u0442\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f IR (\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f) \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">julia&gt; s = &quot;1 + 1 * 2&quot; &quot;1 + 1 * 2&quot;  julia&gt; ex = Meta.parse(s) :(1 + 1 * 2)  julia&gt; dump(ex) Expr   head: Symbol call   args: Array{Any}((3,))     1: Symbol +     2: Int64 1     3: Expr       head: Symbol call       args: Array{Any}((3,))         1: Symbol *         2: Int64 1         3: Int64 2<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 <code>ex<\/code> \u2014 \u044d\u0442\u043e AST. \u0415\u0433\u043e <code>head<\/code> \u2014 \u044d\u0442\u043e <code>:call<\/code>, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>+<\/code> \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 <code>1<\/code> \u0438 \u0435\u0449\u0435 \u043e\u0434\u043d\u0438\u043c <code>Expr<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. \u041d\u0430 \u044d\u0442\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u044b, \u0430 &quot;\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440&quot; \u0414\u0436\u0443\u043b\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d \u0432 \u0432\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>a[i]<\/code> \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u043e \u043d\u0430 <code>getindex(a, i)<\/code>. \u041f\u043e\u0441\u043b\u0435 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439, IR \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d \u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Static_single_assignment_form\" rel=\"nofollow\">SSA (\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f)<\/a>. IR \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &quot;\u043f\u043e\u043d\u0438\u0436\u0435\u043d\u043d\u044b\u043c&quot; IR. \u0412 SSA IR \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u0412 Julia \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 <code>@code_lowed<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c SSA IR \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>Expr<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">julia&gt; @code_lowered 2 + 3 CodeInfo( 1 \u2500 %1 = Base.add_int(x, y) \u2514\u2500\u2500      return %1 )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0436\u0443\u043b\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u044b\u0432\u043e\u0434 \u0442\u0438\u043f\u0430 \u043d\u0430 SSA IR \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e. \u0410 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0435\u0433\u043e \u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/LLVM\" rel=\"nofollow\">LLVM<\/a> \u043a\u043e\u0434\u044b. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b <code>@code_typed<\/code> \u0438 <code>@code_llvm<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u044d\u0442\u0438 IRs.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">julia&gt; @code_typed 2 + 3 CodeInfo( 1 \u2500 %1 = Base.add_int(x, y)::Int64 \u2514\u2500\u2500      return %1 ) =&gt; Int64  julia&gt; @code_llvm 2 + 3  ;  @ int.jl:53 within '+' ; Function Attrs: uwtable define i64 @&quot;julia_+_15307&quot;(i64, i64) #0 { top:   %2 = add i64 %1, %0   ret i64 %2 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, LLVM \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u044d\u0442\u0438 \u043a\u043e\u0434\u044b \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0435 \u043a\u043e\u0434\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">julia&gt; @code_native 2 + 3         .text ; \u250c @ int.jl:53 within '+'         pushq   %rbp         movq    %rsp, %rbp         leaq    (%rcx,%rdx), %rax         popq    %rbp         retq         nopw    (%rax,%rax) ; \u2514<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u043f\u0438\u043a\u0447\u0430 \u0438\u0437 JuliaCon 2018, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Julia.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/0q\/wz\/hg\/0qwzhgp3bxvyesrwb4aeo-mddag.png\"><\/p>\n<p>  <\/p>\n<h3 id=\"kak-rabotaet-yaolangjl\">\u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 YaoLang.jl<\/h3>\n<p>  <\/p>\n<p>\u0426\u0435\u043b\u044c <code>YaoLang.jl<\/code> \u2014 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u043b\u044f \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0445 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e-\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0432 Julia. \u0422\u043e \u0435\u0441\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0438\u0445 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c Julia, \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0412 <code>YaoLang.jl<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0443\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u0430\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c <a href=\"https:\/\/habr.com\/ru\/users\/device\/\" class=\"user_link\">device<\/a>, \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u0412 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u044b <code>@ctrl<\/code>, <code>@measure<\/code>, <code>@expect<\/code> \u0438 &quot;\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440&quot; <code>locs =&gt; gate<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0445\u0435\u043c\u0443 \u0434\u043b\u044f \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0424\u0443\u0440\u044c\u0435 <code>n<\/code> \u043a\u0443\u0431\u0438\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">@device function qft(n::Int)     1 =&gt; H     for k in 2:n         @ctrl k 1 =&gt; shift(2\u03c0 \/ 2^k)     end      if n &gt; 1         2:n =&gt; qft(n - 1)     end end<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 Julia, \u043c\u0430\u043a\u0440\u043e\u0441 <a href=\"https:\/\/habr.com\/ru\/users\/device\/\" class=\"user_link\">device<\/a> \u0431\u0443\u0434\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 IR \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0432 <code>YaoLang.jl<\/code>. \u0417\u0430\u0442\u0435\u043c \u0432\u0441\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0430\u0445\u0430\u0440 \u0434\u043b\u044f \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u042d\u0442\u0438 \u0432\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u043c\u0435\u0442\u043a\u043e\u0439 <code>:quantum<\/code>. \u0422\u0435\u043f\u0435\u0440\u044c IR \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d \u0432 \u043f\u043e\u043d\u0438\u0436\u0435\u043d\u043d\u044b\u0439 SSA IR. \u0412 <code>YaoLang.jl<\/code> SSA IR \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 <code>YaoIR<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u2014 \u044d\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f <code>YaoIR<\/code> \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 \u043d\u0435\u0433\u043e \u0432 \u043a\u043e\u0434\u044b \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. <code>ZXCalculus.jl<\/code> \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u0441\u0445\u0435\u043c \u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yj\/ya\/ka\/yjyakad1j_itf1ktathsmucaxgu.png\"><\/p>\n<p>  <\/p>\n<h2 id=\"integraciya-zxcalculusjl\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f ZXCalculus.jl<\/h2>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u0442\u043e \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c <code>YaoIR<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0443\u044e \u0441\u0445\u0435\u043c\u0443, \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0448\u0430\u0433\u0438<\/p>\n<p>  <\/p>\n<ol>\n<li>\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443<\/li>\n<li>\u0423\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443<\/li>\n<li>\u041f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 <code>YaoIR<\/code><\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0448\u0430\u0433 \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 <code>ZXCalculus.jl<\/code>. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 <code>ZXDiagram<\/code> \u0438 <code>YaoIR<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"yaoir-v-zxdiagram\">YaoIR \u0432 ZXDiagram<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 <code>YaoIR<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f SSA, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0445 \u0438 \u0438\u0445 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u0438\u043d\u0435\u043c \u0432\u0437\u043e\u0440\u043e\u043c \u0441\u0430\u043c\u0443\u044e \u043e\u0431\u0448\u0438\u0440\u043d\u0443\u044e \u043b\u043e\u043a\u0430\u0446\u0438\u044e \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u043a\u0443\u0431\u0438\u0442\u043e\u0432. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0442\u043e\u043b\u043a\u043d\u0435\u043c \u0432 \u043d\u0435\u0435 \u0433\u0435\u0439\u0442\u044b \u043f\u0440\u0438 \u043e\u0431\u0445\u043e\u0434\u0435 <code>YaoIR<\/code>. \u0410 \u043a\u043e\u0434 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">function ZXDiagram(ir::YaoIR)     if ir.pure_quantum         n = count_nqubits(ir)         circ = ZXDiagram(n)         stmts = ir.body.blocks[].stmts         for stmt in stmts             # push gates         end         return circ     end end<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u044f ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u0438 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u0441\u0445\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0437\u044b, \u0442\u043e \u0438 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0437\u044b. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0437\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430.<\/p>\n<p>  <\/p>\n<h3 id=\"zxdiagram-v-yaoir\">ZXDiagram \u0432 YaoIR<\/h3>\n<p>  <\/p>\n<p>\u041c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>ZXDiagram<\/code>, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0443\u044e \u0441\u0445\u0435\u043c\u0443. \u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0432 <code>YaoIR<\/code>, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u0432\u0435\u043d\u0442\u0438\u043b\u0435\u0439 \u0432 <code>ZXDiagram<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0443\u0434\u0438\u0442\u044c \u0438\u0437 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 <code>ZXDiagram<\/code>. \u0422\u0430\u043a \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a \u043f\u0430\u0443\u043a\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0442 \u0432\u0445\u043e\u0434\u0430 \u043a \u0432\u044b\u0445\u043e\u0434\u0443 \u0438 \u0432\u044b\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0443\u0431\u0438\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0430\u0443\u043a\u0430. \u0415\u0441\u043b\u0438 \u043f\u0430\u0443\u043a \u0438\u043c\u0435\u0435\u0442 \u0441\u0442\u0435\u043f\u0435\u043d\u044c 2, \u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0434\u043d\u043e\u043a\u0443\u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u0433\u0435\u0439\u0442. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0432\u0435\u043d\u0442\u0438\u043b\u044c \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043a\u0443\u0431\u0438\u0442\u0430\u043c\u0438. \u041f\u0440\u043e\u0439\u0434\u044f \u0432\u0441\u0435\u0445 \u043f\u0430\u0443\u043a\u043e\u0432 \u043e\u0442 \u0432\u0445\u043e\u0434\u0430 \u043a \u0432\u044b\u0445\u043e\u0434\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u0432\u0435\u043d\u0442\u0438\u043b\u0435\u0439. \u0418 \u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 <code>YaoIR<\/code> \u0441 \u044d\u0442\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>  <\/p>\n<h3 id=\"parametry-optimizacii\">\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/h3>\n<p>  <\/p>\n<p>\u0412 &quot;ZXCalculus.jl&quot; \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c. \u0418 \u043c\u044b \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u044d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u043c\u0430\u043a\u0440\u043e\u0441 <code>@device<\/code>. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">@device optimizer = [opt...] function my_circuit(args...)     ... end<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a <code>optimizer<\/code> \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u0430\u043a \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e <code>[:zx_clifford, zx_teleport]<\/code>. \u0418 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<p>  <\/p>\n<h2 id=\"primery\">\u041f\u0440\u0438\u043c\u0435\u0440\u044b<\/h2>\n<p>  <\/p>\n<p>\u041a \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, <code>ZXCalculus.jl<\/code> \u0431\u044b\u043b\u0430 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0441 <code>YaoLang.jl<\/code>. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>YaoLang.jl<\/code> \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0432 <code>ZXCalculus.jl<\/code>. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0445\u0435\u043c\u0443.<\/p>\n<p>  <\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0434\u0432\u0430 \u043a\u043e\u043d\u0442\u0443\u0440\u0430. \u041e\u0434\u0438\u043d \u2014 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430, \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u043e\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"julia\">using YaoLang  @device function test_cir()     5 =&gt; H     5 =&gt; shift(0.0)     @ctrl 4 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 1 5 =&gt; X     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 4 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 1 5 =&gt; X     4 =&gt; shift($(1\/4*\u03c0))     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 1 4 =&gt; X     4 =&gt; shift($(7\/4*\u03c0))     1 =&gt; shift($(1\/4*\u03c0))     @ctrl 1 4 =&gt; X     @ctrl 4 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 3 5 =&gt; X     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 4 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 3 5 =&gt; X     4 =&gt; shift($(1\/4*\u03c0))     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 3 4 =&gt; X     4 =&gt; shift($(7\/4*\u03c0))     5 =&gt; H     3 =&gt; shift($(1\/4*\u03c0))     @ctrl 3 4 =&gt; X     5 =&gt; shift(0.0)     @ctrl 4 5 =&gt; X     5 =&gt; H     5 =&gt; shift(0.0)     @ctrl 3 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 2 5 =&gt; X     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 3 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 2 5 =&gt; X     3 =&gt; shift($(1\/4*\u03c0))     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 2 3 =&gt; X     3 =&gt; shift($(7\/4*\u03c0))     5 =&gt; H     2 =&gt; shift($(1\/4*\u03c0))     @ctrl 2 3 =&gt; X     5 =&gt; shift(0.0)     @ctrl 3 5 =&gt; X     5 =&gt; H     5 =&gt; shift(0.0)     @ctrl 2 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 1 5 =&gt; X     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 2 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 1 5 =&gt; X     2 =&gt; shift($(1\/4*\u03c0))     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 1 2 =&gt; X     2 =&gt; shift($(7\/4*\u03c0))     5 =&gt; H     1 =&gt; shift($(1\/4*\u03c0))     @ctrl 1 2 =&gt; X     5 =&gt; shift(0.0)     @ctrl 2 5 =&gt; X     @ctrl 1 5 =&gt; X end cir = test_cir()  @device optimizer = [:zx_teleport] function teleport_cir()     5 =&gt; H     5 =&gt; shift(0.0)     @ctrl 4 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 1 5 =&gt; X     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 4 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 1 5 =&gt; X     4 =&gt; shift($(1\/4*\u03c0))     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 1 4 =&gt; X     4 =&gt; shift($(7\/4*\u03c0))     1 =&gt; shift($(1\/4*\u03c0))     @ctrl 1 4 =&gt; X     @ctrl 4 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 3 5 =&gt; X     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 4 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 3 5 =&gt; X     4 =&gt; shift($(1\/4*\u03c0))     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 3 4 =&gt; X     4 =&gt; shift($(7\/4*\u03c0))     5 =&gt; H     3 =&gt; shift($(1\/4*\u03c0))     @ctrl 3 4 =&gt; X     5 =&gt; shift(0.0)     @ctrl 4 5 =&gt; X     5 =&gt; H     5 =&gt; shift(0.0)     @ctrl 3 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 2 5 =&gt; X     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 3 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 2 5 =&gt; X     3 =&gt; shift($(1\/4*\u03c0))     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 2 3 =&gt; X     3 =&gt; shift($(7\/4*\u03c0))     5 =&gt; H     2 =&gt; shift($(1\/4*\u03c0))     @ctrl 2 3 =&gt; X     5 =&gt; shift(0.0)     @ctrl 3 5 =&gt; X     5 =&gt; H     5 =&gt; shift(0.0)     @ctrl 2 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 1 5 =&gt; X     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 2 5 =&gt; X     5 =&gt; shift($(7\/4*\u03c0))     @ctrl 1 5 =&gt; X     2 =&gt; shift($(1\/4*\u03c0))     5 =&gt; shift($(1\/4*\u03c0))     @ctrl 1 2 =&gt; X     2 =&gt; shift($(7\/4*\u03c0))     5 =&gt; H     1 =&gt; shift($(1\/4*\u03c0))     @ctrl 1 2 =&gt; X     5 =&gt; shift(0.0)     @ctrl 2 5 =&gt; X     @ctrl 1 5 =&gt; X end tp_cir = teleport_cir()<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u043a\u0435\u0442\u0430 <a href=\"https:\/\/github.com\/QuantumBFS\/YaoArrayRegister.jl\" rel=\"nofollow\"><code>YaoArrayRegister.jl<\/code><\/a>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0445\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"julia\">using YaoArrayRegister  mat = zeros(ComplexF64, 32, 32) for i = 1:32     st = zeros(ComplexF64, 32)     st[i] = 1     r0 = ArrayReg(st)     r0 |&gt; cir     mat[:,i] = r0.state end  tp_mat = zeros(ComplexF64, 32, 32) for i = 1:32     st = zeros(ComplexF64, 32)     st[i] = 1     r1 = ArrayReg(st)     r1 |&gt; tp_cir     tp_mat[:,i] = r1.state end<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044f \u044d\u0442\u0438 \u0434\u0432\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u0443\u044e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">sum(abs.(mat - tp_mat) .&gt; 1e-14) == 0<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"itogo\">\u0418\u0442\u043e\u0433\u043e<\/h2>\n<p>  <\/p>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 &quot;ZXDiagram&quot; \u0438 &quot;YaoIR&quot;, \u0447\u0442\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e <code>ZXCalculus&quot;.jl<\/code> \u0441 <code>YaoLang.jl<\/code>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 <a href=\"https:\/\/yaoquantum.org\/ZXCalculus.jl\/dev\/\" rel=\"nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0418 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f <code>ZXCalculus&quot;.jl<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>YaoLang.jl<\/code> \u0438 <code>YaoArrayRegister.jl<\/code> \u044f \u043d\u0430\u0448\u0435\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0443\u0440\u043e\u0432 \u0438 \u0444\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u0438. \u042d\u0442\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0443\u0436\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u044f \u0431\u0443\u0434\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0435\u0439 \u043a\u043e\u0434\u043e\u0432 OpenQASM \u0432 \u043a\u043e\u0434\u044b <code>YaoIR<\/code>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0445\u0435\u043c\u044b \u0438\u0437 \u043a\u043e\u0434\u0430 OpenQASM. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c <code>ZXCalculus.jl<\/code> \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0445 \u0441\u0445\u0435\u043c\u0430\u0445 \u0438 \u0441\u0440\u0430\u0432\u043d\u044e \u0435\u0433\u043e \u0441 <code>PyZX<\/code>.<\/p>\n<p>  <\/p>\n<hr>\n<p>  <\/p>\n<h2 id=\"uproschenie-kvantovoy-shemy\">\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e\u0439 \u0441\u0445\u0435\u043c\u044b<\/h2>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ub\/le\/kj\/ublekjogc1jgtukzlv_djepn3vo.png\"><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0441 24 \u0433\u0435\u0439\u0442\u0430\u043c\u0438, \u043a\u0430\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u044b\u0448\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0445\u0435\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/github.com\/QuantumBFS\/YaoLang.jl\" rel=\"nofollow\"><strong>YaoLang.jl<\/strong><\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0430\u043a\u0440\u043e\u0441 <code>@device<\/code>. <strong>YaoLang.jl<\/strong> \u2014 \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u043b\u044f \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0445 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e-\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b \u0432 \u043d\u044b\u043d\u0435\u0448\u043d\u044e\u044e \u044d\u043f\u043e\u0445\u0443 NISQ (noisy intermediate-scale quantum). \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, <strong>YaoLang.jl<\/strong> \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u0441 <strong>ZXCalculus.jl<\/strong>. <\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"julia\">julia&gt; using YaoLang;  julia&gt; @device optimizer = [:zx_teleport] function demo_circ_simp()            1 =&gt; shift($(7\u03c0\/4))            1 =&gt; H            1 =&gt; Rx($(\u03c0\/4))            4 =&gt; H            @ctrl 1 4 =&gt; Z            @ctrl 4 1 =&gt; X            1 =&gt; H            4 =&gt; H            1 =&gt; T            4 =&gt; shift($(3\u03c0\/2))            4 =&gt; X            1 =&gt; H            4 =&gt; S            4 =&gt; X            2 =&gt; S            @ctrl 2 3 =&gt; X            2 =&gt; H            @ctrl 2 3 =&gt; X            2 =&gt; T            3 =&gt; S            2 =&gt; H            3 =&gt; H            3 =&gt; S            @ctrl 2 3 =&gt; X        end demo_circ_simp (generic circuit with 1 methods)<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>optimizer = [opts...]<\/code> \u0432 \u043c\u0430\u043a\u0440\u043e\u0441 <code>@device<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0445\u0435\u043c\u0443 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438: <code>:zx_clifford<\/code> \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u041a\u043b\u0438\u0444\u0444\u043e\u0440\u0434\u0430 [1] \u0438 <code>:zx_teleport<\/code> \u0434\u043b\u044f \u0444\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u0438 [2]. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>optimizer = [:zx_teleport]<\/code> \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0444\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u0438 \u0432 <strong>ZXCalculus.jl<\/strong> \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b.<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441 <code>@code_yao<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0433\u0435\u0439\u0442\u043e\u0432 \u0441\u0445\u0435\u043c\u044b \u0431\u044b\u043b\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u043e \u0441 24 \u0434\u043e 20.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">julia&gt; using YaoLang.Compiler  julia&gt; gate_count(demo_circ_simp) Dict{Any,Any} with 8 entries:   &quot;YaoLang.Rx(3.141592653589793)&quot;     =&gt; 2   &quot;YaoLang.H&quot;                         =&gt; 6   &quot;YaoLang.Rx(0.7853981633974483)&quot;    =&gt; 1   &quot;YaoLang.shift(4.71238898038469)&quot;   =&gt; 1   &quot;YaoLang.shift(1.5707963267948966)&quot; =&gt; 4   &quot;YaoLang.shift(0.7853981633974483)&quot; =&gt; 1   &quot;@ctrl YaoLang.Z&quot;                   =&gt; 1   &quot;@ctrl YaoLang.X&quot;                   =&gt; 4 <\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/QuantumBFS\/YaoArrayRegister.jl\" rel=\"nofollow\"><strong>YaoArrayRegister.jl<\/strong><\/a> \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u043a \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">julia&gt; using YaoArrayRegister;  julia&gt; circ_teleport = demo_circ_simp() demo_circ_simp (quantum circuit)  julia&gt; r = rand_state(4);  julia&gt; r |&gt; circ_teleport ArrayReg{1, Complex{Float64}, Array...}     active qubits: 4\/4<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0445\u0435\u043c\u044b \u0438\u0437 <a href=\"https:\/\/en.wikipedia.org\/wiki\/OpenQASM\" rel=\"nofollow\">OpenQASM<\/a>. OpenQASM \u2014 \u044d\u0442\u043e \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f. \u041a\u043e\u0434\u044b OpenQASM \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 IBM. \u0410 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u0434\u043e\u0432 OpenQASM. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u0430\u043a\u0435\u0442 \u0414\u0436\u0443\u043b\u0438\u0438 <a href=\"https:\/\/github.com\/thautwarm\/RBNF.jl\" rel=\"nofollow\"><strong>RBNF.jl<\/strong><\/a> (\u043f\u0430\u0440\u0441\u0438\u0442 \u043a\u043e\u0434 \u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0443\u044e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Backus%E2%80%93Naur_form\" rel=\"nofollow\">\u0444\u043e\u0440\u043c\u0443 \u0411\u044d\u043a\u0443\u0441\u0430-\u041d\u0430\u0443\u0440\u0430<\/a>) \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 OpenQASM \u043a\u043e\u0434\u043e\u0432 \u0432 AST, \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0435\u0433\u043e \u0432 YaoIR, \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0439 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e-\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b <strong>YaoLang.jl<\/strong>. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c \u0438\u0437 OpenQASM \u0432 <strong>ZXCalculus.jl<\/strong> \u0447\u0435\u0440\u0435\u0437 <strong>YaoLang.jl<\/strong>.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">using YaoLang: YaoIR, is_pure_quantum using ZXCalculus  lines = readlines(&quot;gf2^8_mult.qasm&quot;) src = prod([lines[1]; lines[3:end]]) ir = YaoIR(@__MODULE__, src, :qasm_circ) ir.pure_quantum = is_pure_quantum(ir)  circ = ZXDiagram(ir) pt_circ = phase_teleportation(circ)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u0441\u0445\u0435\u043c\u0443 \u0432 \u0432\u0438\u0434\u0435 <code>ZXDiagram<\/code> \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <code>.qasm<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/QuantumBFS\/ZXCalculus.jl\/tree\/master\/benchmark\/circuits\" rel=\"nofollow\">\u0442\u0443\u0442<\/a>. \u0418 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0444\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e. \u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0422-\u0447\u0438\u0441\u043b\u043e \u0432 \u0446\u0435\u043f\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u043e\u0441\u044c \u0441 448 \u0434\u043e 264.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">julia&gt; tcount(circ) 448  julia&gt; tcount(pt_circ) 264<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u043a\u0430\u043a <strong>ZXCalculus.jl<\/strong> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c \u0432 <strong>YaoLang.jl<\/strong>. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u0446\u0435\u043d\u043e\u0439.<\/p>\n<p>  <\/p>\n<h3 id=\"nizkourovnevye-interfeysy-zxcalculus\">\u041d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b ZXCalculus<\/h3>\n<p>  <\/p>\n<p>\u0412 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e \u0441 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438 \u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u0433\u0440\u0430\u0444\u0430\u043c\u0438 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439. \u041a\u0430\u0436\u0434\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0443\u043a\u043e\u043c. \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u043f\u0430\u0443\u043a\u043e\u0432, Z-\u043f\u0430\u0443\u043a \u0438 X-\u043f\u0430\u0443\u043a. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0443\u043a \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u0447\u0438\u0441\u043b\u043e\u043c, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u043c \u0444\u0430\u0437\u043e\u0439. \u041f\u043e \u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0414\u0438\u0440\u0430\u043a\u0430 Z-\u043f\u0430\u0443\u043a \u0438 X-\u043f\u0430\u0443\u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0440\u0430\u043d\u0433\u0430 2.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/y4\/l3\/ze\/y4l3zequ9ihvm5nmd8uy9dzrib4.png\" title=\"\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 Z-\u043f\u0430\u0443\u043a\u0430 \u0438 X-\u043f\u0430\u0443\u043a\u0430 (\u0438\u0437 [1])\"><\/p>\n<p>  <\/p>\n<p>ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0441\u043e\u0431\u044b\u0439 \u0442\u0438\u043f \u0442\u0435\u043d\u0437\u043e\u0440\u043d\u043e\u0439 \u0441\u0435\u0442\u0438. \u041a\u0430\u043a \u0438 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u0441\u0445\u0435\u043c\u044b. \u0410 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0435 \u0441\u0445\u0435\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mt\/3w\/d5\/mt3wd5lrfooyaucydlb6_xefxqu.png\" title=\"Conversion from quantum circuits to ZX-diagrams\"><\/p>\n<p>  <\/p>\n<p>\u0416\u0435\u043b\u0442\u0430\u044f \u043a\u043e\u0440\u043e\u0431\u043a\u0430, H-box, \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u0443\u043a\u043e\u0432 \u0432 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ut\/sv\/on\/utsvonvdoovf0mys1ravqemrgum.png\" title=\"H-box from [1]\"><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u0445 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>ZXDiagram<\/code> \u0432 <strong>ZXCalculus.jl<\/strong>. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0441 <code>n<\/code> \u043a\u0443\u0431\u0438\u0442\u0430\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/yaoquantum.org\/ZXCalculus.jl\/dev\/api\/#ZX-diagrams\" rel=\"nofollow\"><code>ZXDiagram(n)<\/code><\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u0443\u044e \u0432\u044b\u0448\u0435 \u0441\u0445\u0435\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>ZXCalculus.jl<\/strong> \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u0441\u0445\u0435\u043c\u044b \u0438\u0437 4 \u043a\u0443\u0431\u0438\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">using ZXCalculus zxd = ZXDiagram(4)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043a ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b\u0438. \u041f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/yaoquantum.org\/ZXCalculus.jl\/dev\/api\/#ZXCalculus.push_gate!\" rel=\"nofollow\"><code>push_gate!<\/code><\/a> \u0438 <code>push_ctrl_gate!<\/code> <\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"julia\">push_gate!(zxd, Val(:Z), 1, 7\/\/4) push_gate!(zxd, Val(:H), 1) push_gate!(zxd, Val(:X), 1, 1\/\/4) push_gate!(zxd, Val(:H), 4) push_ctrl_gate!(zxd, Val(:CZ), 4, 1) push_ctrl_gate!(zxd, Val(:CNOT), 1, 4) push_gate!(zxd, Val(:H), 1) push_gate!(zxd, Val(:H), 4) push_gate!(zxd, Val(:Z), 1, 1\/\/4) push_gate!(zxd, Val(:Z), 4, 3\/\/2) push_gate!(zxd, Val(:X), 4, 1\/\/1) push_gate!(zxd, Val(:H), 1) push_gate!(zxd, Val(:Z), 4, 1\/\/2) push_gate!(zxd, Val(:X), 4, 1\/\/1) push_gate!(zxd, Val(:Z), 2, 1\/\/2) push_ctrl_gate!(zxd, Val(:CNOT), 3, 2) push_gate!(zxd, Val(:H), 2) push_ctrl_gate!(zxd, Val(:CNOT), 3, 2) push_gate!(zxd, Val(:Z), 2, 1\/\/4) push_gate!(zxd, Val(:Z), 3, 1\/\/2) push_gate!(zxd, Val(:H), 2) push_gate!(zxd, Val(:H), 3) push_gate!(zxd, Val(:Z), 3, 1\/\/2) push_ctrl_gate!(zxd, Val(:CNOT), 3, 2)<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b\u0438. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <strong>ZXCalculus.jl<\/strong> \u0432 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/QuantumBFS\/YaoPlots.jl\" rel=\"nofollow\"><strong>YaoPlots.jl<\/strong><\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">using YaoPlots plot(zxd)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bc\/on\/t8\/bcont8divvbvc8zzvn-odx1xx9c.png\" title=\"Original circuit\"><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f <a href=\"https:\/\/yaoquantum.org\/ZXCalculus.jl\/dev\/api\/#ZXCalculus.clifford_simplification\" rel=\"nofollow\"><code>clifford_simplification<\/code><\/a> [1] \u0438 <a href=\"https:\/\/yaoquantum.org\/ZXCalculus.jl\/dev\/api\/#ZXCalculus.phase_teleportation\" rel=\"nofollow\"><code>phase_teleportation<\/code><\/a> [2]<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">ex_zxd = clifford_simplification(zxd); pt_zxd = phase_teleportation(zxd); plot(ex_zxd) plot(pt_zxd)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_v\/pv\/rz\/_vpvrzl2vwa3mngr47ojsewqrio.png\" title=\"Circuit after clifford_simplification\"><br \/>  <em>\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0441\u043b\u0435 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u041a\u043b\u0438\u0444\u0444\u043e\u0440\u0434\u0430<\/em><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jg\/xw\/uk\/jgxwuk95zodzmovmpm06w7ahkjw.png\" title=\"Circuit after phase_telefortation\"><br \/>  <em>\u0421\u0445\u0435\u043c\u0430 \u043f\u043e\u0441\u043b\u0435 \u0444\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u0438<\/em> <\/p>\n<p>  <\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0444\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0422-\u0432\u0435\u043d\u0442\u0438\u043b\u0435\u0439 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e\u0439 \u0441\u0445\u0435\u043c\u044b. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <a href=\"https:\/\/yaoquantum.org\/ZXCalculus.jl\/dev\/api\/#ZXCalculus.tcount-Tuple%7BAbstractZXDiagram%7D\" rel=\"nofollow\"><code>tcount<\/code><\/a> \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0422-\u0432\u0435\u043d\u0442\u0438\u043b\u0435\u0439. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0447\u0438\u0441\u043b\u043e \u0422 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u043e\u0441\u044c \u0441 4 \u0434\u043e 2.<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">julia&gt; tcount(zxd) 4  julia&gt; tcount(pt_zxd) 2<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c. \u042d\u0442\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442, \u043a\u0430\u043a ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b. \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f <code>ZXDiagram<\/code>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bu\/gp\/ht\/bugphtbpc4ltr58epoatnmyveta.png\" title=\"ZX-calculus rules from [1]\"><\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0430\u0431\u043e\u0442\u0435 [1] \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u043e\u0441\u043e\u0431\u044b\u0439 \u0442\u0438\u043f ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b \u2014 \u0433\u0440\u0430\u0444\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>ZXGraph<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0435 \u0432 <strong>ZXCalculus.jl<\/strong>. \u0418 \u0432\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f <code>ZXGraph<\/code><\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/se\/8p\/2p\/se8p2pupi60tb2rw3yu6rtxwgy0.png\" title=\"Rules for graph-like ZX-diagrams from [1] and [2]\"><\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043d\u0430 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 API.<\/p>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/yaoquantum.org\/ZXCalculus.jl\/dev\/api\/#Base.match\" rel=\"nofollow\"><code>match<\/code><\/a> \u043d\u0430\u0439\u0434\u0435\u0442 \u0432\u0441\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 <a href=\"https:\/\/yaoquantum.org\/ZXCalculus.jl\/dev\/api\/#ZXCalculus.rewrite!\" rel=\"nofollow\"><code>rewrite!<\/code><\/a> \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0448\u0438\u043d\u0430\u0445. <a href=\"https:\/\/yaoquantum.org\/ZXCalculus.jl\/dev\/api\/#Base.replace!\" rel=\"nofollow\"><code>replace!<\/code><\/a> \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u043e\u0434\u0438\u043d \u0440\u0430\u0437. <a href=\"https:\/\/yaoquantum.org\/ZXCalculus.jl\/dev\/api\/#Base.replace!\" rel=\"nofollow\"><code>simplify!<\/code><\/a> \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d.<\/p>\n<p>  <\/p>\n<p>\u0412 <code>clifford_simplification<\/code>, \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u0443\u044e ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443 \u0432 \u0433\u0440\u0430\u0444\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0443<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">zxg = ZXGraph(zxd) plot(zxg)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nq\/bj\/dn\/nqbjdnkmfutzxlfa8z1w_s66oqw.png\" title=\"Graph-like ZX-diagram\"><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0442\u0435\u043c, \u043c\u044b \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u043c \u0435\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0430\u0432\u0438\u043b <code>:lc<\/code>, <code>:p1<\/code>, \u0438 <code>:pab<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">simplify!(Rule{:lc}(), zxg) simplify!(Rule{:p1}(), zxg) replace!(Rule{:pab}(), zxg) plot(zxg)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/md\/ce\/3s\/mdce3slbotvfx3eyco1qpg1hcgw.png\" title=\"Simplified graph-like ZX-diagram\"><\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0438\u0437 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0439 \u0433\u0440\u0430\u0444\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b<\/p>\n<p>  <\/p>\n<pre><code class=\"julia\">ex_circ = circuit_extraction(zxg) plot(ex_circ)<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_v\/pv\/rz\/_vpvrzl2vwa3mngr47ojsewqrio.png\" title=\"Extracted circuit\"><\/p>\n<p>  <\/p>\n<h2 id=\"pochemu-imenno-zxcalculusjl\">\u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e ZXCalculus.jl?<\/h2>\n<p>  <\/p>\n<p>\u0412\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 Python <a href=\"https:\/\/github.com\/Quantomatic\/pyzx\" rel=\"nofollow\"><strong>PyZX<\/strong><\/a>. <strong>PyZX<\/strong> \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0440\u0443\u043f\u043d\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u044b\u043c\u0438 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u043c\u0438 \u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u0438 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438. \u041e\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u0441\u0445\u0435\u043c, \u0432\u043a\u043b\u044e\u0447\u0430\u044f QASM, Quipper \u0438 Quantomatic.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 <strong>ZXCalculus.jl<\/strong>? \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e <strong>ZXCalculus.jl<\/strong> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043d\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0434\u043b\u044f ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c \u0434\u043b\u044f <strong>YaoLang.jl<\/strong>. \u041b\u0435\u0433\u043a\u0430\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u043f\u0430\u043a\u0435\u0442\u0430 Python \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>  <\/p>\n<h3 id=\"benchmarks\">Benchmarks<\/h3>\n<p>  <\/p>\n<p>\u041c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0444\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u0438 \u043d\u0430 40 \u0441\u0445\u0435\u043c\u0430\u0445 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0432\u0435\u043d\u0442\u0438\u043b\u0435\u0439 (\u043e\u0442 57 \u0434\u043e 91642). <strong>ZXCalculus.jl<\/strong> \u0438\u043c\u0435\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u0442 6 \u0434\u043e 50 \u0440\u0430\u0437 \u0432 \u044d\u0442\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 (\u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <strong>ZXCalculus.jl<\/strong> \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u043e 1 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u043d\u0430 \u044d\u0442\u043e\u043c \u0440\u0438\u0441\u0443\u043d\u043a\u0435). \u042d\u0442\u0438 \u0442\u0435\u0441\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c Intel i7-10710U \u0438 16 \u0413\u0411 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u041a\u043e\u0434 \u0434\u043b\u044f \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/Roger-luo\/quantum-benchmarks\" rel=\"nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xt\/aa\/mb\/xtaambycsmcrt8k81xpme13lb_e.png\" title=\"The wall clock time for optimizing the same circuit in ZXCalculus.jl and PyZX. The run time of ZXCalculus.jl is scaled to 1 for each circuit.\"><\/p>\n<p>  <\/p>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 T-\u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0445\u0435\u043c, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0445 <strong>ZXCalculus.jl<\/strong>, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 <a href=\"https:\/\/github.com\/Quantomatic\/pyzx\" rel=\"nofollow\"><strong>PyZX<\/strong><\/a>. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 2 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 <strong>ZXCalculus.jl<\/strong> \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 T-count, \u0447\u0435\u043c <strong>PyZX<\/strong>. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u043c\u0438 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 <strong>ZXCalculus.jl<\/strong> \u0438 <strong>PyZX<\/strong>. \u041c\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xo\/92\/pz\/xo92pzirjw25ycoy2ufzbvaf0u0.png\" title=\"T-count benchmarks \u043c\u0435\u0436\u0434\u0443 ZXCalculus.jl \u0438 PyZX. TRUE \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 ZXCalculus.jl \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 PyZX, FALSE \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0445\u0435\u043c\u0430 \u0432 ZXCalculus.jl \u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0430\"><\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, <strong>YaoLang.jl<\/strong> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0435 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e-\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0435 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u043e-\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <strong>ZXCalculus.jl<\/strong>.<\/p>\n<p>  <\/p>\n<h2 id=\"rezyume-i-dalneyshey-raboty\">\u0420\u0435\u0437\u044e\u043c\u0435 \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b<\/h2>\n<p>  <\/p>\n<p>\u0412 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 GSoC 2020 \u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ZX-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438 \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e.<\/li>\n<li>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 ZX-\u0441\u0445\u0435\u043c\u044b \u0432 <strong>YaoPlots.jl<\/strong>.<\/li>\n<li>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f <strong>ZXCalculus.jl<\/strong> \u0441 <strong>YaoLang.jl<\/strong>.<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 OpenQASM \u0432 <strong>YaoLang.jl<\/strong>.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043a\u043e\u0435-\u0447\u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041f\u043e\u0438\u0441\u043a \u043b\u0443\u0447\u0448\u0435\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043d\u0438\u0437\u043a\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f T.<\/li>\n<li>\u041f\u043e\u043b\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 &quot;ZXGraph&quot; (\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0435\u0440\u043f\u0435\u0442\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u0443 \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 &quot;ZXGraph&quot; \u0441 \u0444\u0430\u0437\u043e\u0432\u044b\u043c\u0438 \u0433\u0430\u0434\u0436\u0435\u0442\u0430\u043c\u0438).<\/li>\n<li>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 ZX-\u0441\u0445\u0435\u043c\u044b \u0434\u043b\u044f \u0442\u0435\u043d\u0437\u043e\u0440\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0431\u0435\u0437 <strong>YaoLang.jl<\/strong>.<\/li>\n<li>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 &quot;YaoIR&quot; \u0438 &quot;ZXDiagram&quot; \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u0445\u0435\u043c\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0437\u044b. \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0430\u0437\u0443 \u0432 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 <strong>YaoLang.jl<\/strong> \u0441 \u0420\u043e\u0434\u0436\u0435\u0440\u043e\u043c \u041b\u043e, \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c (\u043c\u0435\u0442\u043e\u0434\u044b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Quon \u0438 \u0442.\u0434.).<\/p>\n<p>  <\/p>\n<h2 id=\"blagodarnosti\">\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438<\/h2>\n<p>  <\/p>\n<p>\u042f \u0445\u043e\u0447\u0443 \u043f\u043e\u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0438\u0442\u044c \u0441\u0432\u043e\u0438\u0445 \u043d\u0430\u0441\u0442\u0430\u0432\u043d\u0438\u043a\u043e\u0432, \u0420\u043e\u0434\u0436\u0435\u0440\u0430 \u041b\u043e \u0438 \u0426\u0437\u0438\u043d\u044c\u0433\u043e \u041b\u044e. \u0411\u0435\u0437 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u0438 \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u0431\u044b \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442. <strong>ZXCalculus.jl<\/strong> \u043e\u0447\u0435\u043d\u044c \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0435\u043d <strong>PyZX<\/strong>. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0410\u043b\u0435\u043a\u0441 \u041a\u0438\u0441\u0441\u0438\u043d\u0434\u0436\u0435\u0440 \u0438 \u0414\u0436\u043e\u043d \u0432\u0430\u043d \u0434\u0435 \u0412\u0435\u0442\u0435\u0440\u0438\u043d\u0433, \u0430\u0432\u0442\u043e\u0440\u0430\u043c <strong>PyZX<\/strong>. \u041e\u043d\u0438 \u0434\u0430\u043b\u0438 \u043c\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0444\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u0438 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 <strong>PyZX<\/strong> \u0438 <strong>ZXCalculus.jl<\/strong>. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044e Google \u0437\u0430 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <strong>Google Summer of Code<\/strong>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>[1]: <a href=\"https:\/\/arxiv.org\/abs\/1902.03178\" rel=\"nofollow\">Graph-theoretic Simplification of Quantum Circuits with the ZX-calculus<\/a><br \/>  [2]: <a href=\"https:\/\/arxiv.org\/abs\/1903.10477\" rel=\"nofollow\">Reducing T-count with the ZX-calculus<\/a><\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/524368\/\"> https:\/\/habr.com\/ru\/post\/524368\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/k3\/er\/5f\/k3er5fawrdg-ut5fw9joizgsuja.png\" alt=\"image\"><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0443\u0431\u0440\u0438\u043a\u0443 \u0442\u0435\u043c \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0432\u0438\u0434\u0430\u043d\u0438\u044f. \u041d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u0439 \u043f\u043e\u0432\u0435\u0441\u0442\u043a\u0435 \u0434\u043d\u044f \u2014 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c \u0434\u043b\u044f \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 ZX-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-312030","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/312030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=312030"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/312030\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=312030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=312030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=312030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}