Короче:
Учитывая, что a является общим для b, если GCD (a, b) = 1 (где GCD означает отличный общий делитель), сколько положительных целых чисел ниже N взаимно просты в N?
Есть ли умный способ?
Не требуется материал
Вот самый тупой способ:
def count_coprime(N):
counter = 0
for n in xrange(1,N):
if gcd(n,N) == 1:
counter += 1
return counter
Он работает, но он медленный и немой. Я бы хотел использовать умный и быстрый алгоритм. Я попытался использовать простые множители и делители N, но всегда получаю то, что не работает с большим N.
Я думаю, что алгоритм должен иметь возможность подсчитывать их, не вычисляя их, как самый тупой алгоритм: P
Изменить
Кажется, я нашел рабочий:
def a_bit_more_clever_counter(N):
result = N - 1
factors = []
for factor, multiplicity in factorGenerator(N):
result -= N/factor - 1
for pf in factors:
if lcm(pf, factor) < N:
result += N/lcm(pf, factor) - 1
factors += [factor]
return result
где lcm является наименее общим кратным. Кто-нибудь есть лучший?
Примечание
Я использую python, я думаю, что код должен быть доступен для чтения даже для тех, кто не знает python, если вы найдете что-то, что неясно, просто спросите в комментариях. Меня интересует алгоритм и математика, идея.