Знаменатель и числитель

Форум пользователей пакета Maple

Модератор: Admin

Ivo
Сообщения: 11
Зарегистрирован: Ср дек 19, 2007 12:24 am

Знаменатель и числитель

Сообщение Ivo » Вс дек 23, 2007 3:33 pm

не могу понять как это исправить :
denom(4*i/((1-i)^2*(2-i)))
ответ: (-1+i)^2*(-2+i)

numer(4*i/((1-i)^2*(2-i)))
ответ: -4*i

понятно, что вычисления верные, но я не могу понять зачем она выносит знак минус за скобки?
да черт с ним с пониманием, может кто нибудь подскажет как исправить это? т.е. чтобы функция denom возвращала знаменатель таким как он есть без вынесения знака минуса.
ps i - это не мнимая единица

Irmantas
Сообщения: 589
Зарегистрирован: Ср апр 27, 2005 8:49 pm
Откуда: Литва, Каунас

Re: Знаменатель и числитель

Сообщение Irmantas » Вс дек 23, 2007 9:41 pm

Можно так, но это ручное работа
Z:=4*i/((1-i)^2*(2-i));op(Z):
`*`(op(Z)[1..2]);
1/`*`(op(Z)[3..-1]);

Ivo
Сообщения: 11
Зарегистрирован: Ср дек 19, 2007 12:24 am

Сообщение Ivo » Вс дек 23, 2007 10:48 pm

вариант, конечно, но как ты сказал все ручками.
спасибо.

Ivo
Сообщения: 11
Зарегистрирован: Ср дек 19, 2007 12:24 am

Сообщение Ivo » Вс дек 23, 2007 11:43 pm

поробывал поэкспериментировать: получилось, что как только в знаменателе появляется кроме переменных число и где нибудь в заменателе происходит вычитатание, то программа начинает выносить минус за скобки как и в числителе так и в знаменателе. кстати в mathematica такого не происходит.

Irmantas
Сообщения: 589
Зарегистрирован: Ср апр 27, 2005 8:49 pm
Откуда: Литва, Каунас

Сообщение Irmantas » Пн дек 24, 2007 1:01 am

Папробувал написать процедуру. Её ещё надо даработать
Z:=(4-2*i)^3/((1-i)^2*(2-i));

numer_denom:=proc(L::algebraic)
local k, LD, LN;
if type(L,`^`) and nops(L)=2 then if op(L)[2]<0
then RETURN(1,op(1,L)^abs(op(2,L)))
elif op(L)[2]>0 then RETURN(L,1); end if
elif nops(L)=2 and not type(L,`*`) then RETURN(L,1)
else LN,LD:=[1],[1]; print(`3`);
for k in [op(L)] do
if type(k,`^`) and op(2,k)<0 then LD:=[op(LD),op(1,k)^abs(op(2,k))]
else LN:=[op(LN),k];
end if: end do; end if;
LN,LD:=`*`(op(LN)),`*`(op(LD)); end proc:
numer_denom(Z);

Ivo
Сообщения: 11
Зарегистрирован: Ср дек 19, 2007 12:24 am

Сообщение Ivo » Пн дек 24, 2007 1:29 am

Тебя смотрю тема зацепила:))Кста, работает твоя процедура. Я просто тож над ней думал, но скорее есть какой то другой путь.Как я и писал выше, ситуация возникает как только есть минус и числа. Пытался с помощью assume придать переменным различный статус, но ничего. Где то тут собака порылась.

Ivo
Сообщения: 11
Зарегистрирован: Ср дек 19, 2007 12:24 am

Сообщение Ivo » Вт янв 01, 2008 9:41 pm

Разобрался почему так происходит.
Функции numer и denom работают в непостредственной связке с функцией normal. Даже если вы не вызывали normal(), то ее вызов произойдет автоматически, как раз перед вызовом numer и denom. "магическое" вынесение минуса за скобки происходит как раз таки благодаря normal...

aar
Сообщения: 100
Зарегистрирован: Чт авг 10, 2006 11:27 am

Сообщение aar » Ср янв 02, 2008 11:32 am

Ivo писал(а):Функции numer и denom работают в непостредственной связке с функцией normal. Даже если вы не вызывали normal(), то ее вызов произойдет автоматически, как раз перед вызовом numer и denom. "магическое" вынесение минуса за скобки происходит как раз таки благодаря normal...


Не совсем так. Сравните:

Код: Выделить всё

> denom((x^2-5*x+4)/(x-1));
                      x - 1
> denom(normal((x^2-5*x+4)/(x-1)));
                                      1

С другой стороны, выносится не только минус:

Код: Выделить всё

> denom(4*i/((1-i)^2*(2-4*i)));
                                    2           
                         (-1 + i)  (-1 + 2 i)