Прежде всего, я думаю, вам нужно использовать значение temp
в качестве ключа к вашим данным:
// this makes more sense, otherwise you
// could simply have an array of BigIntegers
b.Add(temp,i);
Что касается проблемы с памятью, .NET не позволяет никаким процессам использовать более 2 ГБ памяти, а позволяет даже меньше, если вам нужен непрерывный блок. Поскольку вы имеете дело с очень большими числами по мере продвижения, нехватка памяти неизбежна.
Одним из решений (предпочтительно, если вам нужен только конечный результат) было бы использование другого алгоритма ( Алгоритм Полларда ), который намного более экономно использует пространство и имеет аналогичное время выполнения.
Если вы действительно хотите протестировать алгоритм BSGS, вам, вероятно, понадобится хеш-таблица на основе диска. Я не знаю каких-либо реализаций для .NET, но вы можете найти несколько проектов C ++ и посмотреть, сможете ли вы их легко портировать (например, DBH ).
Если вы не можете найти такую хеш-таблицу, более простым решением, чем портирование (ну, в зависимости от ваших навыков работы с БД), может быть использование реляционной базы данных, с которой вам удобно, используя схему, которая может допускать достаточно большие целые числа. Вы можете попробовать с SQLite, он будет становиться медленнее по мере роста, но я считаю, что скорость не так важна для вас. SQL Server с определенной индексацией может работать хорошо.