Ярлыки

Показаны сообщения с ярлыком программирование. Показать все сообщения
Показаны сообщения с ярлыком программирование. Показать все сообщения

пятница, 16 мая 2014 г.

Задание в методичку по квантовому программированию.

Есть квантовый компьютер с памятью 3 кубита. Определим однобитовые гейты\[\mathrm{H1}=\mathrm{Not}=\left(\begin{array}{cc}0&1\\1&0\end{array}\right)\,,\quad \mathrm{H2}=\mathrm{H}=\frac1{\sqrt{2}}\left(\begin{array}{cc}1&1\\1&-1\end{array}\right)\,,\quad \mathrm{H3}=\frac1{\sqrt{3}}\left(\begin{array}{cc}\sqrt{2}&1\\1&-\sqrt{2}\end{array}\right)\]
и их  управляемые варианты $\mathrm{cnH1}\,,\ \mathrm{cnH2}\,,\ \mathrm{cnH3}$, которые выполняют над битом соответствующее преобразование только если остальные два бита равны единице.
Система комманд нашего компьютера состоит из четырех комманд: $\mathrm{H1}\,,\ \mathrm{cnH1}\,,\ \mathrm{cnH2}\,,\ \mathrm{cnH3}$. Надо написать алгоритм, который при подаче на вход двоичного числа от 0 до 7 строит состояние (с определенным спином и проекцией) с соответствующим номером:
  1. $\sqrt{1/2}(|001\rangle-|010\rangle)$
  2. $\sqrt{1/2}(|101\rangle-|110\rangle)$
  3. $\sqrt{1/6}(|001\rangle+|010\rangle-2|100\rangle)$
  4. $\sqrt{1/6}(|101\rangle+|110\rangle-2|011\rangle)$
  5. $|000\rangle$
  6. $\sqrt{1/3}(|001\rangle+|010\rangle+|100\rangle)$
  7. $\sqrt{1/3}(|101\rangle+|110\rangle+|011\rangle)$
  8. $|111\rangle$
Здесь можно потренироваться:

Boilerplate
Your Program

вторник, 2 апреля 2013 г.

Docked Cells в Mathematica

Все, кто программировал в Математике, знают, что одна из самых полезных операций называется Quit Kernel. Удивительно, что для нее нет ни клавиатурного сокращения, ни кнопки. Нужно лезть в меню Evaluation>Quit Kernel>Local, а затем еще жать Ok в появившемся окошке с предупреждением. Есть немного более простой способ, конечно --- ввести Quit и нажать Shift-Enter. Но если ядро занято другими вычислениями, этот способ не работает. Есть и третий способ: создать кнопку командой  Button["Quit", Quit[]] и жать на нее в свое удовольствие. Проблема в том, что кнопочка эта постепенно уплывает из зоны видимости. Можно, конечно, сгенерировать палитру (palette) и для кого-то это будет самый удобный вариант. Понятно, что для настоящего художника в палитре должна быть не только черная краска, так что в палитру можно оформить несколько ваших любимых кнопок.
Однако, в том, что палитра хранится отдельно от файла есть как достоинства, так и недостатки. Достоинства, понятно, в том, что одну палитру можно использовать при работе в любом файле. Недостаток --- в том, что взяв с собой файл на другой компьютер, нужно не забыть взять и установить туда и палитру. Выходом из этого концептуального тупика может стать Docked Cell. По сути, это та же палитра, только определенного вида. Важно, что хранится она  прямо в файле. Вот пример создания Docked Cell-а с тремя кнопками:
SetOptions[InputNotebook[], DockedCells -> {Cell[BoxData[ToBoxes[
      Row[{Button["Quit", Quit[]],
        Button["Abort", FrontEndTokenExecute["FindEvaluatingCell"];
         FrontEndTokenExecute["EvaluatorAbort"]],
        Button["Evaluate", FrontEndTokenExecute["EvaluateCells"];
         SelectionMove[InputNotebook[], Next, Cell]]}]
      ]],
    Background -> RGBColor[0.9, 0.9, 0.9],
    CellMargins -> 0,
    CellFrame -> {{0, 0}, {1, 0}}]}]

Жмем Shift-Enter и вуаля. Кому-то может показаться, что вбивать такую команду в каждом новом файле утомительно. Согласен, но тут можно и палитру сделать:
CreatePalette[Button["Install tools",SetOptions[InputNotebook[], DockedCells -> {Cell[BoxData[ToBoxes[
      Row[{Button["Quit", Quit[]],
        Button["Abort", FrontEndTokenExecute["FindEvaluatingCell"];
         FrontEndTokenExecute["EvaluatorAbort"]],
        Button["Evaluate", FrontEndTokenExecute["EvaluateCells"];
         SelectionMove[InputNotebook[], Next, Cell]]}]
      ]],
    Background -> RGBColor[0.9, 0.9, 0.9],
    CellMargins -> 0,
    CellFrame -> {{0, 0}, {1, 0}}]}]]]

А еще лучше --- сделать такую палитру
CreatePalette[{Row[{Button["Quit", Quit[]],
    Button["Abort", FrontEndTokenExecute["FindEvaluatingCell"];
     FrontEndTokenExecute["EvaluatorAbort"]],
    Button["Evaluate", FrontEndTokenExecute["EvaluateCells"];
     SelectionMove[InputNotebook[], Next, Cell]]}],
  Button["embed tools",
   SetOptions[InputNotebook[],
    DockedCells -> Most@First@NotebookGet[ButtonNotebook[]]],
   ContentPadding -> False, FrameMargins -> 0]}]

среда, 27 марта 2013 г.

Еще идефикс

Все, конечно, знают, что риманова поверхность функции \[\sqrt{P_{2g+2}(z)},\] где $P_{2g+2}(z)$ --- полином $2g+2$ порядка, в общем случае гомеоморфна сфере с $g$ ручками. В частности, риманова поверхность функции $f(z)=\sqrt{z^4-1}$ должна быть гомеоморфна тору. Я вот тоже это недавно узнал. Ну, я когда-то знал это раньше, но забыл, да, да. Полезно потренировать воображение и сообразить, как непрерывной деформацией превратить тор в дважды накрытую сферу Римана с четырьмя точками ветвления. Я такими вещами обычно занимаюсь, когда не могу заснуть.
Проблема в том, что когда картинка понятна, очень хочется ее нарисовать, и сопротивляться этому желанию у меня пока не получается. Иначе картинка будет висеть в бэкграунде и тормозить весь мыслительный процесс. Вот только в данном случае нужно не нарисовать, а анимировать. К счастью, Wolfram Mathematica заботится о нас, толкает свой CDF формат (как альтернативу PDF-у, что-ли?). Ладно, попробуем. Ниже результат.
Когда ползунок в самой правой позиции, имеем дважды накрытую сферу Римана, на которой однозначно определена наша функция $f(z)$. Четыре конца красных линий соответствуют корням нашего полинома $\pm1,\pm i$. Сами линии обозначают один из возможных способов выбрать разрезы.



P.S. Главное страдание --- выдумать подходящую функцию, интерполирующую между двумя крайними положениями. Первоначальная простая, как три копейки, мысль --- интерполировать как $(1-t)*тор+t*сфера2$ --- дает убогий результат.

пятница, 23 марта 2012 г.

Научная жизнь

осторожно, бесстыдная самореклама
Вчера наконец-то послали (с Ваней и А.И.) в архив работу по квантовой механике. Работа находилась в вялотекущем состоянии довольно долго, может год, может больше. Причина такого торможения --- в том, что для продвижения приходилось преодолевать некоторые предрассудки, весьма распространенные среди теор. физиков. Мое отношение к задаче в разные моменты времени можно выразить различными комбинациями "это интересно", "это патологично" и "это тривиально".
Ну кто бы мог подумать, что с виду нормальный, эрмитовый гамильтониан может привести к эффективно неупругому рассеянию? Кто бы мог подумать, что стационарные решения могут быть локально неинтегрируемые с квадратом, да и просто невозводимые в квадрат, а кроме того, еще и странно вырожденными в радиальной задаче? И при этом пригодными для разложения временного решения?

Ниже --- анимация рассеяния сферического пакета, локализованного изначально на больших $r$. Отразилась только часть пакета, а часть "прилипла". Если вам такая динамика не кажется странной, или даже невозможной, значит вы плохо учили квантовую механику.
P.S. Теперь на очереди другая задача --- написание пакета, реализующего давнюю тайную мечту любого ученого --- решение всех проблем в автоматическом режиме, включая в перспективе и написание статьи с изложенными результатами. Когда напишу --- моя миссия на работе сведется к нажатию кнопки утром и засылке в архив готовой работы вечером. Пока написанное выглядит так:

воскресенье, 18 марта 2012 г.

Нафига он нужен, этот Replace

В рамках программы подготовки к неизбежно приближающемуся склерозу.
Есть в Математике такая функция Replace. Долгое время я ее считал практически бесполезной, в отличии от ее старших родственников  ReplaceAll (/.) и ReplaceRepeated(//.). Но недавно я осознал, что эта функция является мощной заменой функции Switch. А именно,
Switch[expr, form1, value1, form2,value2,...]
в подавляющем большинстве случаев можно заменить на
Replace[expr, {form1:> value1, form2:>value2,...}]
Преимущество в том, что именнованные части паттерна formi можно использовать при построении valuei. Ну вот, теперь я понимаю зачем нужна функция Replace. Жалко только, что теперь я не понимаю зачем нужна функция Switch.
Вот, кстати, пример использования Replace  в процедуре SplitCases, которую, я думаю, стоит включить в следующий релиз Математики:
SplitCases[l_List,ps_List]:=Module[
  {pls=Table[{},{Length[ps]}],pn},
  Append[pls,#]&[Replace[l,

MapIndexed[pn:#:>(pls[[First@#2]]=Append[pls[[First@#2]],pn];Unevaluated[Sequence[]])&,ps],{1}]]]

вторник, 13 марта 2012 г.

Полезность.

Поскольку занимаюсь в настоящий момент добиванием пакета на Математике, пытаюсь облегчить себе жизнь всеми возможными способами. Сегодня аспирант навел на полезную мысль. Нет, говорит, в Математике тестов. Выяснилось, что речь о следующем. Когда отлаживаешь какой-нибудь пакет, хорошо иметь набор тестов, который запускается после модификации пакета и сравнивает вновь получившиеся результаты с теми, что получались до модификации. Ну, действительно хорошо. Сказано-сделано, вот простейший пакет, призванный помочь пакетописателям. Работает так. Допустим, что ценой неимоверных усилий была написана функция, вычисляющая числа Фиббоначи:
f[1]=f[2]=1;
f[n_Integer?Positive]:=f[n-1]+f[n-2];
Работает функция правильно, но долго, и хочется ее переписать так, чтобы она работала быстро. И тут вы узнаете, что есть чудная формула\[f_n=\frac{\varphi ^n-(-\varphi )^{-n}}{\sqrt{5}}\,.\] Хочется переписать функцию, но страшно, вдруг где-нибудь сделаешь ошибку. Тогда делаем так: загружаем пакет Tests.m и со старым определением f[n] создаем некоторое количество тестов:
<<"Tests.m"
SaveTest[f[15],"Fib15"];
SaveTest[f[20],"Fib20"];
SaveTest[f[30],"Fib30"];

Затем меняем наше определение
Clear[f];
f[n_Integer?Positive]:=Expand[(((1 - Sqrt[5])/2)^n 
                              +((1 + Sqrt[5])/2)^n)/Sqrt[5]]

И проверяем на уже известных примерах:
RunTests["Fib*"]
Получаем гневные сообщения:
Fib15 Failed.
Input:f[15] -> 1364/Sqrt[5]
Output:610 -> 610
Fib20 Failed.
Input:f[20] -> 15127/Sqrt[5]
Output:6765 -> 6765
Fib30 Failed.
Input:f[30] -> 1860498/Sqrt[5]
Output:832040 -> 832040
{"Fib15" -> "Failed", "Fib20" -> "Failed", "Fib30" -> "Failed"}
 
Значит, где-то затупили... Ага, забыли минус, исправляем:
Clear[f];
f[n_Integer?Positive]:=Expand[(-((1 - Sqrt[5])/2)^n 
                              + ((1 + Sqrt[5])/2)^n)/Sqrt[5]]
Ну вот, теперь все в порядке:
Fib15 Passed.
Fib20 Passed.
Fib30 Passed.
{"Fib15" -> "Passed", "Fib20" -> "Passed","Fib30" -> "Passed"}
Ну, там есть еще некоторые возможности, желающим глядеть в код или использовать ?"Tests`*". Кстати, тесты хранятся в виде файла "tests.tst" в рабочей директории, поэтому не теряются от сессии к сессии.