┌──┌─┐┌──
──┘├─┘──┘ Presents
┐  ┌┐┐┌─┤ VMag, Issue 1, 1 June 1997
└─┘┘ ┘└─┘ ──────────────────────────

                 Теория чисел - вирумэйкерам ;).

        Один из разработчиков MS-DOS - Mark  Zbikovski,  в  честь
которого и по сей день exe-файлы отмечены сигнатурой 'MZ'. Именно
по этой сигнатуре (а не  по  расширению)  DOS  различает  exe-  и
com-файлы. И все бы было хорошо, если бы не мания величия Марка -
с таким же успехом может использоваться  и  сигнатура  'ZM'.  Это
создает некоторые неудобства при  определении  типа  исполняемого
файла.

        Системный загрузчик DOS делает это следующим образом:

3D4D5A        cmp       ax,5a4dh ; 'MZ'
74??          je        exe
3D5A4D        cmp       ax,4d5ah ; 'ZM'
74??          je        exe

        Мы предлагаем более другой способ:

F7D0          not       ax
F6E4          mul       ah
3DBA72        cmp       ax,72bah ; not'M'*not'Z'
74??          je        exe

        Короче на байт и не так в глаза бросается.

        Может возникнуть подозрение,  что  такую  проверку  могут
удовлетворить ;) какие-то другие сочетания двух  байт,  например,
'MK' (Morshchakin-Kopec) или  'KM'  (соответственно)...  Докажем,
что это подозрение беспочвенно.

        Дано уравнение not(x)*not(y)=(not'M')*(not'Z').  Докажем,
что существует только два решения данного уравнения: ('M','Z')  и
('Z','M') при условии,  что  x<256,  y<256,  x  и  y  принадлежат
множеству натуральных чисел ;).

                         Доказательство:

        not'M' = 178 = 2*89   ─┬──── разложили на простые
        not'Z' = 165 = 3*5*11 ─┘     множители.

        Тогда (not'M')*(not'Z') = 2*3*5*11*89.

        a=not(x)<256, b=not(y)<256, a*b=2*3*5*11*89. Т.е. один из
множителей, например a, должен делиться на 89.

        Т.к. 256 div 89 = 2, то очевидно, что  a=89  или  a=2*89.
При a=89 -> b=2*3*5*11=330>255, при a=2*89  ->  b=3*5*11,  что  и
требовалось доказать.

                                                      //KAA/Scout