Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, Кодт, Вы писали:
К>>Получится пинг-понг между состояниями <...,p=1,p'=0,...> и <...,p=0,p'=1,...>
_>Не получится. Надо условный цикл. А пин понг приводит к длинным трекам, и ограничениям по максимальному допустимому значению в цикле.
_>надо именно
_>[a-b-c][b]
_>Т.е u=pa/pb/pc если число x делится этим u нацело то умножаем на u и на z=pb
квадрат пропустил, иначе и у тебя не зациклится — надо же восстановить степень pb после деления
_>while (x*pa/pb/pc is integer) do x*= (pa/pb/pc) * pb
Я именно это и имею в виду.
Условие, на самом деле
while (x/pb is integer and x/pc is integer)
давай перепишем:
было
while true:
if x * pa / pb / pc is integer then x *= pa / pc ( / pb * pb * pb)
else
break
стало
while true:
if x * pa / pb1 * pb2 / pc is integer then x *= pa / pb1 * pb2 / pc
else
if x * pa * pb1 / pb2 / pc is integer then x *= pa * pb1 / pb2 / pc
else
break
Объяснение этому вот какое:
— очевидно, что мы можем повсеместно заменить фактор pb на pb^2, квадрат простого числа будет по-прежнему взаимно-простым со всеми остальными факторами
— очевидно, что мы можем повсеместно заменить фактор pb на (pb1*pb2), по тем же причинам
— теперь, если мы введём вектор (pb1,pb2), то получим не два состояния (степени множителя) 0 и 1, а 00,01,10,11 — из которых нас интересуют первые три
— теперь, если мы введём класс эквивалентности — 01=10, то у фрактран-машины появится легальное действие: "поделить на фактор и умножить на этот же фактор" — чего не бывает с обычными дробями
— но класс эквивалентности требует расщепления: одна дробь делит на одно число из класса и умножает на другое, вторая — наоборот.
Если мы договариваемся, что степень у фактора метки — всегда 0 или 1, — то проблем не возникает.
Вход в метку — умножение на любое число из класса эквивалентности.
Оставание в метке — пинг-понг. (Удваиваем все инструкции)
Выход из метки — отсутствие умножения. (Удваиваем все инструкции)