Условное определение матричных элементов в sage

В Sage, пытаясь определить матрицу с условиями для ячеек:

matrix([[(if gcd(i, j) == 0: log(radical((i+j)*i*j)) else: -1.0) for j in srange(1, 5)] for i in srange(1, 5)])

Я получаю синтаксическую ошибку:

...
matrix([[(if gcd(i, j) == _sage_const_0 : log(radical((i+j)*i*j)) else: -_sage_const_1p0 ) for j in srange(_sage_const_1 , _sage_const_5 )] for i in srange(_sage_const_1 , _sage_const_5 )])
           ^
SyntaxError: invalid syntax

В чем проблема? Как это исправить?


person Raphael J.F. Berger    schedule 09.08.2016    source источник


Ответы (2)


Вот еще одна возможность.

sage: f = lambda i, j: log(radical((i + j)*i*j)) if gcd(i,j) == 1 else -1
sage: m = matrix(SR, 4, lambda i, j: f(i + 1, j + 1))
sage: m
[ log(2)  log(6)  log(6) log(10)]
[ log(6)      -1 log(30)      -1]
[ log(6) log(30)      -1 log(42)]
[log(10)      -1 log(42)      -1]

Здесь используется другой синтаксис для инициализации матрицы, в котором мы сначала указываем базовое кольцо, размер матрицы, а затем функцию (i, j) для коэффициентов. Обратите внимание: поскольку Sage индексирует строки и столбцы из 0, мы должны применить нашу функцию к i + 1 и j + 1.

Помещение -1 для не взаимно простого числа (i, j) может работать лучше, чем -1.0 для точных вычислений.

person Samuel Lelièvre    schedule 03.12.2016

Ваша проблема на самом деле связана с Python, а не с Sage как таковым. Python имеет некоторую фильтрацию для понимания списков, но это не похоже на это. См., например. этот вопрос.

So let's try it:

matrix([[log(radical((i+j)*i*j)) if gcd(i,j)==0 else -1.0 for j in srange(1,5)] for i in srange(1,5)])

Кстати, ты действительно хотел if gcd(i,j)==1? Маловероятно, что вы получите нулевой общий делитель в этом!

person kcrisman    schedule 09.08.2016
comment
Странно, столько вариантов перепробовал (я новичок и в ру и в sage), конечно работает. И да, это должно быть ==1. Большое спасибо! - person Raphael J.F. Berger; 09.08.2016
comment
Не за что - и рад, что вы действительно хотели сопричастности! - person kcrisman; 10.08.2016