Векторизация вашего алгоритма, где я мог бы немного сократить время выполнения до ~ 8,5 минут.Вычислите все суммы гармоник в одном утверждении:
harmonicsum = cumsum(1 ./ (1:1e6));
Теперь вы можете вычислить правую часть в одном утверждении:
rhs = harmonicsum + log(harmonicsum) .* exp(harmonicsum);
Я не смог векторизовать определениефакторы, так что это самый быстрый способ, которым я мог бы придумать их.Команда MATLAB FACTOR позволяет вам генерировать все основные факторы для каждой итерации.Затем мы вычисляем уникальный набор продуктов всех возможных комбинаций, используя UNIQUE и NCHOOSEK .Это позволяет избежать проверки каждого целого числа как фактора.
lhs = zeros(1e6, 1);
for ii = 1:1e6
primeFactor = factor(ii);
numFactor = length(primeFactor);
allFactor = [];
for jj = 1:numFactor-1
allFactor = [allFactor; unique(prod(nchoosek(primeFactor, jj), 2))];
end
lhs(ii) = sum(allFactor) + 1 + ii;
end
lhs(1) = 1;
Найти индексы, при которых нарушается гипотеза Римана:
isViolated = find(lhs > rhs);