2. Коды процедур
Здесь приводятся коды процедур, используемых в вычислениях. Вы можете скопировать эти процедуры в виде m-файлов в папку WORK директории MATLAB и поставить собственные эксперименты с физикой на поле Галуа.
function y=ameasur(x)
% Оператор антиредукции y=ameasur(x)
% y-вектор алгоритмического состояния c субъективной ошибкой
%
% Copyright Kaminski A.V.
% $Revision: $Date: 2003/09/22 $
n=numel(x);
j=1+fix(n*rand);
if rand < .5
x(j)=~x(j);
end
y=x;
function [y, z] = measur(x)
%Оператор редукции
%Преобразовывает алгоритмический вектор n-мерного пространства
%в ближайший (с точностью до субъективной ошибки) вектор физического
%состояния.
% Y-вектор физического состояния
% X-вектор алгоритмического состояния
% n-размерность алгоритмического пространства
%
% Copyright Kaminski A.V.
% $Revision: $Date: 2003/09/22 $
n=numel(x);
H=hadamard(n+1);
H=(H+1)/2;
H=H(2:n+1,:);
H=[H,~H];
for i=1:(n+1)*2;
R=xor(H(:,i),x);
if sum(R)<=1 ;
y=H(:,i);
z=i;
end;
end
function y=geval(x,n)
%функция эволюции. Перемещает алгоритмическую точку на n шагов вдоль
%траектории Грея в m - мерном двоичном пространстве. x - входной вектор, y - выходной.
% Copyright Kaminski A.V.
% $Revision: $Date: 2003/09/22 $
n1=numel(x);
b=graybin(x);
a=arrbit(b);
a=mod(a+n,2^n1);
c=bitarr(a);
yy=bingray(c);
n2=numel(yy);
n=n1-n2;
z((1:n),1)=0;
y=[yy;z];
function y=bitarr(x)
%Функция целого числа. Возвращает массив коэффициентов разложения этого
%числа по степеням 2.В первом элементе массива - младщий разряд.
% Copyright Kaminski A.V.
% $Revision: $Date: 2003/09/22 $
i=0;
z=x;
a(1)=0;
while z
i=i+1;
r=mod(z,2);
z=fix(z/2);
a(i)=r;
end
y=a';
function y=arrbit(x)
%Функция конвертирует бинарный вектор в число в естественной позиционной
%двоичной системе счисления. Обратная ей bitarr.
% Copyright Kaminski A.V.
% $Revision: $Date: 2003/09/22 $
n=numel(x);
y=0;
for i=1:n;
y=y+x(i)*2^(i-1);
end
function y=bingray(x)
%Преобразует двоичный позиционный код в код Грея. x - входной вектор, y -
%выходной. Первый элемент вектора - младший разряд.
% Copyright Kaminski A.V.
% $Revision: $Date: 2003/09/22 $
m=numel(x);
x(m+1)=0;
for i=1:m
b(i)=xor(x(i+1),x(i));
end
y=b';
function y=graybin(x)
%Преобразует код Грея в двоичный позиционный. x - входной вектор, y - выходной.
% Copyright Kaminski A.V.
% $Revision: $Date: 2003/09/22 $
m=numel(x);
b(m+1)=0;
for i=(m+1):-1:2
b(i-1)=xor(b(i),x(i-1));
end
y=b(1:m)';
Программа перекодировки физических состояний использовалась для перехода от метрики естественной нумерации к метрике Грея.
F=getphis(7);
for i=1:16
ff=graybin(F(:,i));
z(i)=arrbit(ff);
end
Rez=sort(z)
for i=1:16
for j=1:16
if z(i)==Rez(j);
dec(i)=j;
end
end
end
Это случай без интерференции (открыта одна щель)
f= F(:,5);
y=0;
for s=1:128
for n=1:50
a0=ameasur( f);
a1= geval(a0,s);
[Rez,h]=measur(a1);
num(n)=dec(h);
end
y(s+1,1:16)=hist(num,1:16);
end
contour(y)
Это случай интерференции с фиксированной базой.
y=0;
f= F(:,5);
for s=0:128
for n=0:100
a0=ameasur( f);
a1= geval(a0,s);
a2= geval(a0,s+39);
a3= xor(a1,a2);
[Rez,h]=measur(a3);
num(n+1)=dec(h);
end
y(s+1,1:16)=hist(num,1:16);
end
contour(y)
-----------