octave 06 and 08WIP

This commit is contained in:
Andrew 2019-12-17 00:29:33 +07:00
parent e9d7aa3900
commit c3777e550b
15 changed files with 303 additions and 0 deletions

View file

@ -0,0 +1,4 @@
function [h] = alph_entropy(P);
P = P(P ~= 0);
h = -sum(P.*log2(P));
endfunction;

6
1sem/octave/08/avg_len.m Normal file
View file

@ -0,0 +1,6 @@
## Author: nuark <nuark@DESKTOP-MJTVANB>
## Created: 2019-12-08
function l = avg_len(C, P)
l = sum(cellfun(@length, C) .* P);
endfunction

16
1sem/octave/08/code.txt Normal file
View file

@ -0,0 +1,16 @@
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

View file

@ -0,0 +1,17 @@
## Author: nuark <nuark@DESKTOP-MJTVANB>
## Created: 2019-12-08
function msg = decode_msg(emsg, code)
alph = ['0':'9' 'A':'F'];
msg = '';
word = '';
for c = emsg
word(end + 1) = c;
match = strcmp(code, word);
if any(match)
msg = strcat(msg, alph(match));
word = '';
end
end
end

View file

@ -0,0 +1,18 @@
## Author: nuark <nuark@DESKTOP-MJTVANB>
## Created: 2019-12-08
function emsg = encode_msg(msg, code)
alph = ['0':'9' 'A':'F'];
l_msg = length(msg);
emsg = '';
for i = 1:l_msg
mask = alph == msg(i);
if any(mask)
emsg = strcat(emsg, code(mask));
else
warning("[WARN] Symbol '%s' (at pos. %d from msg) not found in alphabet", msg(i), i)
end
end
emsg = emsg{1,1};
end

49
1sem/octave/08/gen_msg.m Normal file
View file

@ -0,0 +1,49 @@
% Программа генерации случайного сообщения в алфавите, содержащем не более 36 символов: 0, ..., 9, A, ..., Z.
% Автор: Кирилл Владимирович Пушкарёв.
% Дата: 26 октября 2019 г.
% Версия: 0.2
% Параметры:
% p - вектор, содержащий от 2 до 36 неотрицательных чисел.
% Вероятности символов алфавита.
% len - целое число.
% Длина сообщения.
function msg = gen_msg(p, len)
% Создаём вектор символов алфавита 0, ..., 9, A, ..., Z
alph = ['0':'9' 'A':'Z'];
% Если p не вектор, ошибка
if ~isvector(p)
error('p must be a vector')
end
% Если длина вектора p больше длины alph, ошибка
if length(p) > length(alph)
% Выводим сообщение об ошибке, подставляя в него целые числа (%d) длины векторов
error('p is too long (%d > %d)', length(p), length(alph));
end
% Если длина вектора p меньше 2, ошибка
if length(p) < 2
error('p is too short (%d < 2)', length(p));
end
% Если длина не одно число, ошибка
if ~isscalar(len)
error('len must be a scalar')
end
% Если длина меньше 1, ошибка
if len < 1
error('len is too small (%d < 1)', len)
end
% Создаём пустую строку для записи сообщения
msg = '';
% Цикл по i от 1 до len
for i = 1:len
% Заносим случайно выбранный с заданными вероятностями символ в msg
msg(i) = alph(rand_discr(p));
end
end
% Функция генерации целого случайного числа i с вероятностью p(i).
% Параметры:
% p - вектор неотрицательных чисел, сумма элементов которого равна 1.
% Вероятности.
function r = rand_discr(p)
r = sum(cumsum(p) < rand()) + 1;
end

1
1sem/octave/08/hex.txt Normal file
View file

@ -0,0 +1 @@
4.80000000e+01 4.90000000e+01 5.00000000e+01 5.10000000e+01 5.20000000e+01 5.30000000e+01 5.40000000e+01 5.50000000e+01 5.60000000e+01 5.70000000e+01 6.50000000e+01 6.60000000e+01 6.70000000e+01 6.80000000e+01 6.90000000e+01 7.00000000e+01

31
1sem/octave/08/main.m Normal file
View file

@ -0,0 +1,31 @@
#stage 6
V=33;
rand("state", V);
#stage 7
alph = char([48:57 65:70]);
save -ascii "hex.txt" alph;
#stage 8
code = arrayfun(@(n)dec2bin(n, 4), 0:15, "UniformOutput", false);
dlmwrite('code.txt', char(code), '');
#stage 9
r = rand(1, 16);
ralph = r./sum(r);
for i = 1:100
msg = gen_msg(ralph, 10);
encoded = encode_msg(msg, code);
decoded = decode_msg(encoded, code);
if ~strcmp(msg, decoded)
error("[ERR] Encoded message '%s' not equal to decoded variant '%s'!", msg, decoded)
end
end
a_len = avg_len(code, ralph);
min_avg_len = min_bits(length(alph));
min_len = min(arrayfun(@length, code));
rel_opt = alph_entropy(ralph)/(log2(length(ralph)) * a_len);
results = [a_len, min_avg_len, min_len, rel_opt];
save -ascii "results.txt" results;

View file

@ -0,0 +1,6 @@
## Author: nuark <nuark@DESKTOP-MJTVANB>
## Created: 2019-12-08
function r = min_bits(N)
r = ceil(log2(N));
endfunction

View file

@ -0,0 +1 @@
4.00000000e+00 4.00000000e+00 1.00000000e+00 2.44102196e-01