2017-01-15 20 views
5

Próbuję napisać metodę generowania sekwencji dzielników Gaussa z liczby całkowitej Gaussa - liczba całkowita Gaussa to normalna liczba całkowita lub liczba zespolona g = a + bi, gdzie a i b są zarówno liczbami całkowitymi, jak i dzielnik Gaussa liczby całkowitej Gaussa g jest liczbą całkowitą Gaussa d tak, że g/d jest również liczbą całkowitą Gaussa.Python 3 - liczby zespolone

Mam następujący kod.

Wydaje się, że "głównie" działa, ale w przypadku niektórych danych wejściowych brakuje niektórych dzielników Gaussa, np. dla 2 Spodziewam się, że sekwencja zawiera divisor -2 + 0j (który jest tylko -2), ale go brakuje. Nie wiem, dlaczego to robi, ani gdzie jest luka w logice.

In [92]: list(gaussian_divisors(2)) 
Out[92]: [(-1-1j), (-1+0j), (-1+1j), -1j, 1j, (1-1j), (1+0j), (1+1j), (2+0j)] 
+0

W pytonie 3 operatorem podziału liczb całkowitych jest '//', a nie '/'. Nie mam pojęcia, co robi ze złożonymi operandami. –

+0

Nie sądzę, że operator '//' stosuje się do liczb zespolonych, np. '1/1j' podaje' -1j' zgodnie z oczekiwaniami, ale '1 // -1j' zgłasza błąd:' TypeError: nie można pobrać piętra o liczbie zespolonej. '. Jest tak prawdopodobnie dlatego, że nie ma naturalnego uporządkowania liczb zespolonych w przeciwieństwie do liczb całkowitych. – srm

+0

OK, prawdopodobnie będziesz chciał zdefiniować własny operator podzielności, ponieważ '/' nie będzie działało poprawnie dla wystarczająco dużych operandów. Również dla 'g = 2',' ubound = 1', twoja pętla przechodzi od -1 do 1. Nigdy nie testujesz -2. –

Odpowiedz

1

Zamiast uzyskując

yield g 

można dodatkowo

yield -g 

Ponieważ twoje pętle start i stop w int(math.sqrt(abs(g))) = int(sqrt(2)) który jest po prostu 1 więc to po prostu próba -1, 0 i 1.

Alternativly jeśli chcesz dołączyć -2 i 2 w swoich pętli trzeba albo zwiększamy ubound lub math.ceil wynik sqrt.