Как да проверите дали комплексното число е цяло число

Дадена е числова стойност x, можете просто да направите това float(x).is_integer(), за да проверите дали е цяло число. Има ли начин да се направи това за комплексни числа?

Опитвам се да използвам списъчно разбиране, за да взема само целите корени на полином върху крайно поле, които са цели числа.

[r for r in solve(f,domain=FiniteField(p)) if float(r).is_integer()]

но ако функцията solve връща сложни корени, това не работи.

Някой знае ли как да: провери дали дадено (евентуално сложно число) е цяло число ИЛИ знае дали има функция SymPy за получаване на корените на полином върху крайно поле, които са цели числа?


person Kevin Johnson    schedule 25.03.2015    source източник
comment
Искате да кажете просто да проверите реалната част за цялост и да игнорирате имагинерната част?   -  person smci    schedule 25.03.2015
comment
Можете ли да покажете някои примерни входове и изходи, за да можем да разберем по-добре проблема?   -  person Mark Dickinson    schedule 25.03.2015
comment
Между другото, аргументът domain=FiniteField(p) към solve изглежда не прави нищо.   -  person Mark Dickinson    schedule 25.03.2015
comment
Опитайте това: [irred for irred in factor(f, modulus=p).as_ordered_factors() if degree(irred) == 1]. Това ви дава само линейните множители на моничен полином f по модул p и от тях трябва да можете да извлечете корените.   -  person Mark Dickinson    schedule 25.03.2015


Отговори (4)


Използвайте ground_roots функция заедно с аргумента на ключовата дума modulus. Това връща корените по модул p, с кратности. Ето един пример:

>>> from sympy import Symbol, ground_roots
>>> x = Symbol('x')
>>> f = x**5 + 7*x + 1
>>> p = 13
>>> ground_roots(f, modulus=p)
{-5: 1, 4: 2}

Това казва, че корените на poly по модул 13 са -5 и 4, като коренът 4 има кратност 2.

Между другото, изглежда ми, че комплексните числа са червена херинга тук: корените на интегрален полином върху крайно поле не може естествено да се разглежда като комплексни числа. Извикването на solve в първоначалната ви публикация игнорира аргумента domain и просто дава алгебрични числа (които могат разумно да се тълкуват като комплексни числа) като свои резултати, което вероятно е причината, поради която в крайна сметка сте търсили комплексни числа. Но те няма да помогнат, когато се опитваме да намерим корените по модул просто число p.

person Mark Dickinson    schedule 25.03.2015
comment
По дяволите Току-що намерих функцията ground_roots. Сега трябва да изхвърля по-голямата част от този отговор. - person Mark Dickinson; 25.03.2015
comment
(Неохотно) изтри лутането с функцията factor. Работи, но ground_roots е много по-директен. - person Mark Dickinson; 25.03.2015
comment
Да, това подозирах за сложните корени, но не бях сигурен как да посоча правилно домейна! Но това е точно това, от което се нуждая, така че благодаря много! - person Kevin Johnson; 26.03.2015

float.is_integer(z.real) ви казва дали реалната част е цяло число

person smci    schedule 25.03.2015
comment
@Mohit Jain, да, отговаря на въпроса на OP, който беше Има ли начин да се направи [проверете дали реалната част е цяло число] за комплексни числа? - person smci; 25.03.2015
comment
Извинявай моя грешка. В такъв случай предлагам да добавите кратко описание. - person Mohit Jain; 25.03.2015
comment
@MohitJain. Вече има кратко описание: казва ви дали реалната част е цяло число. Какво, за Бога? Бихте ли изтрили коментарите си. - person smci; 25.03.2015

Ако искате да проверите дали имагинерната част е нула, можете да направите следното:

In [17]: a=2 + 2j

In [18]: bool(a.imag)
Out[18]: True

In [19]: b=2 + 0j

In [20]: bool(b.imag)
Out[20]: False
person Marcin    schedule 25.03.2015

Използвайки разбиране на списък, както във вашия първоначален въпрос, човек може да направи:

roots = [complex(r) for r in solve(f, domain=FiniteField(p))]
int_roots = [z.real for z in roots if z.real.is_integer() and not z.imag]
person leogama    schedule 09.10.2019