Кучу if-ов можно заменить на выбор из массива. Во всяком случае обычно - можно. Для исходного правила (хоть 30, хоть любого) достаточно массива в 8 ячеек, для этого модифицированного - сами считайте.
Плюс хранить левую и правую границу (если они могут быть не симметричны) и считать только в их рамках.
Примерно так:
Код:
? rule=[0,1,1,1,1,0,0,0]; \\для исходного правила 30
? m=vector(9);m[5]=1; \\начальное состояние
? n=vector(#m);
? for(i=4,6,n[i]=rule[m[i-1]*4+m[i]*2+m[i+1]+1]);m=n \\тут границы счёта 4..6 поставлены руками
%1 = [0, 0, 0, 1, 1, 1, 0, 0, 0]
? for(i=2,#m-1,n[i]=rule[m[i-1]*4+m[i]*2+m[i+1]+1]);m=n \\тут границы максимальны
%2 = [0, 0, 1, 1, 0, 0, 1, 0, 0]
? for(i=2,#m-1,n[i]=rule[m[i-1]*4+m[i]*2+m[i+1]+1]);m=n
%3 = [0, 1, 1, 0, 1, 1, 1, 1, 0]
Разумеется тут простор для дальнейшей оптимизации скорости: отказ от второго массива, хранение левых двух бит отдельно, сразу в переменной-индексе, один доступ к исходному массиву на каждом шаге, один сдвиг влево и сложение вместо суммы произведений, вычисление границ.
Если нужен только центральный столбец (ну плюс-минус), то можно прогнать счёт вперёд, а потом назад, с уменьшением границ счёта обратно до центра, ведь влияние ячеек ограничено, это позволит удвоить количество итераций (для центрального участка).
(Оффтоп)
Хотел прикинуть как быстро можно считать на асме под AVX2 - ну люблю я это дело, да - но там видно даже на глаз, что нужно два битовых сдвига на каждый выходной бит в байте, т.е. 14 сдвигов на весь регистр 256 битов, они не параллелятся и идут в один порт, так что скорость не выше 18 битов на такт. Краевые эффекты (пересечения границ 64 бит) будут малы, их всего 3шт на 256 битов, скорость из-за них упадёт ну пусть даже в идеале до 16 битов на такт. На миллиард битов и 3ГГц на ядро скорость порядка 50 итераций в секунду на ядро. И это хорошо оптимизированный ассемблер! Плюс чтение и запись памяти ограничит скорость примерно до тех же цифр, порядка 50-100 Гбит/с. Так что не раскатывайте губу на десятки миллиардов битов или даже на миллионы битов на PARI, у меня одна итерация кода выше занимает 0.4с для миллиона ячеек, ускорить можно раза в три-четыре думаю. Хотя, если запустить на GPU, вот тогда да, скорость будет ещё на порядок-два выше, можно думать и о сотне миллиардов битов. Или на процессоре с AVX512, там есть удобная команда вычисления бита, вместо 14-20 тактов на регистр может хватить и 3-5.