Поскольку не существует детерминированного решения проблемы (как заявлено @Mark Byers), вы можете попробовать вероятностный подход.
Сложно получить исходную прогрессию, но ее скорость можно легко получить с помощьюсравнивая различия между элементами.Разница оригинальных будет кратна скорости.
Предположим, вы берете 2 элемента из списка (вероятность того, что оба они принадлежат исходной последовательности 1/4
) и вычисляете разницу.Эта разница с вероятностью 1/4 будет кратна норме.Разложите его на простые множители и подсчитайте их (например, 12 = 2^^2 * 3
добавит счетчик 2 к 2 и увеличит счетчик 3).
После многих таких итераций (это выглядит хорошей проблемой для вероятностных методов, таких как Монте-Карло ), вы можете проанализировать счетчики.
Если первичному коэффициенту принадлежит ставка, его счетчик будет по крайней мере num_iteartions/4
(или num_iterations/2
, если он появится дважды).
Основная проблема заключается в том, что малые факторы будут иметь большую вероятность при случайном вводе (например, разница между двумя случайными числами будет иметь 50% вероятности деления на 2).Таким образом, вам придется компенсировать это: поскольку 3/4 ваших различий были случайными, вы должны учитывать, что (3/8)*num_iterations
из 2-х счетчиков следует игнорировать.Поскольку это также применимо ко всем степеням двойки, самый простой способ - создать «маску белого шума», взяв различия только между случайными числами.
РЕДАКТИРОВАТЬ: давайте продолжим этот подход.Предположим, что вы создали эту «маску белого шума» (назовем ее спектр ) для случайных чисел, и рассмотрим, что это спектр с базой 1, поскольку их наименьший «наибольший общий фактор» равен 1. Путем вычисления ее дляВ отличие от арифметической последовательности, вы получите спектр base-R, где R
- скорость, и она будет эквивалентна сдвинутой версии спектра base-1.Таким образом, вы должны найти значение R так, чтобы
your_spectrum ~= spectrum(1)*3/4 + spectrum(R)*1/4
Вы также могли проверить наибольшее число R
, чтобы по крайней мере половина элементов была равна по модулю R
.