LazyCat писал(а):
Вот на досуге придумал алгоритм вычисления функции Эйлера с весьма эффективной аппаратной реализацией (даже в домашних условиях) :D
Код:
a = n;
b = n/2;
c = 0;
do {
c++;
if(!(a & 1)) {a>>=1; a+=b;}
else a>>=1;
} while(a);
or
LazyCat писал(а):
Кстати, ни Someone ни tolstopuz (которых Вы яростно защищаете) ни на одну ошибку не указали а развели флейм, мешая другим плодотворно работать !!!
А зачем я дожен заниматься поиском ошибок? Я вижу, что Вы вычисляете функцию Эйлера последовательным сложением единиц. Для того, чтобы метод был практически интересным, его нужно применять к числам порядка
и даже больше. Значение
, конечно, меньше
, но не намного. Чтобы просуммировать
единиц, не хватит времени существования Вселенной, даже если мы всю наблюдаемую часть Вселенной превратим в компьютеры и заставим их складывать эти самые единицы. И никакое аппаратное ускорение не поможет. Отсюда и моё "ехидство". Я ведь не первый раз сталкиваюсь с претендентами на открытие сверхэффективных методов разложения на множители, и всегда предлагаю им продемонстрировать свой алгоритм на деле, вместо того, чтобы трепать языком.
К тому же, Ваша процедура даёт ещё не функцию Эйлера, а какой-то её делитель. Вы предполагаете, что получается
или
? Это неверно. Неверно даже то, что
является степенью двойки. А это означает, что, вычислив
, мы не будем знать, на что его умножить, чтобы получить
, и даже не сможем быстро подобрать, поскольку чисел, на которые можно умножать, также будет слишком много.
Вот код на языке компьютерной системы Mathematica, реализующий Ваш алгоритм:
Код:
Fhi[n_Integer] := Module[{a, b, c},
a = n; b = Floor[n/2]; c = 0; Label[One]; c++; If[
Mod[a, 2] == 0, a = Floor[a/2] + b, a = Floor[a/2]]; If[a > 0, Goto[One]]; c]
Проверьте соответствие своему коду.
Вот код, использующий определённую выше функцию:
Код:
For[j=61,j≤70,j++,P1=Prime[j];For[k=2,k<j,k++,P2=Prime[k];n=
P1 P2;F1=Fhi[n];F2=EulerPhi[n];m=F2/F1;If[2^Floor[Log[2,
m]]≠m,Print["P1 = ",P1,", P2 = ",P2,
", n = ",n,", Fhi = ",F1,", EulerPhi = ",F2,",
EulerPhi/Fhi = ",FactorInteger[F2/F1]];Print[
"Fhi = ",FactorInteger[F1]]]]]
Вот пара строк, напечатанных этим кодом:
Код:
P1 = 349, P2 = 331, n = 115519, Fhi = 1740, EulerPhi = 114840, EulerPhi/Fhi = {{2, 1}, {3, 1}, {11, 1}}
Fhi = {{2, 2}, {3, 1}, {5, 1}, {29, 1}}
Это означает, что для числа
Ваш алгоритм даёт
, в то время как
.
Так что интересного предмета для обсуждения пока не видно.