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

Учитывая числовое значение x, вы можете просто сделать это float(x).is_integer(), чтобы проверить, является ли оно целым числом. Есть ли способ сделать это для комплексных чисел?

Я пытаюсь использовать понимание списка, чтобы брать только целые корни многочлена над конечным полем, которые являются целыми числами.

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

но если функция решения возвращает сложные корни, это не работает.

Кто-нибудь знает, как: проверить, является ли заданное (возможно, комплексное число) целым числом, ИЛИ узнать, есть ли функция 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 Да, это отвечает на вопрос ОП, который был Есть ли способ [проверить, является ли действительная часть целым числом] для комплексных чисел? - person smci; 25.03.2015
comment
Извини, я виноват. В таком случае я бы предложил добавить краткое описание. - person Mohit Jain; 25.03.2015
comment
@МохитДжейн. У него уже есть краткое описание: указывает, является ли действительная часть целым числом. Что на земле? Не могли бы вы удалить свои комментарии. - 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