|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Vitaly Slobodskoy 2:5015/128.22 30 Mar 2003 00:55:06 To : Alexandr Taloverov Subject : Re^2: полином n-й степени -------------------------------------------------------------------------------- потекло 27.03.03... *ТЫ хочешь поговорить об этом??* VT>> Хехехе: x^n-1. Чем не полином энной степени? =) AT> нужно ,найти не сам полином, а его коpни ;) Вот мой исходник, переделанный с паскаля на дельфи (захотелось мне, помню, 32 бита поюзать, чтобы точнее было). Там используется метод Лобачевского, небольшие мои доработки по округлению числа. Писалось давно, классе в 10-том. Hаходит все корни, довольно точно. Глючит, если есть комплексные корни. Знаю, как улучшить, применив метод Штурма... однако что-то всё никак... {$APPTYPE CONSOLE} program rab; uses sysutils,math; var n,i,j,k,l,u:integer; a,b,c,d,e:array [0..10] of extended; z,h,t,mem,m1,m:extended; s:string; label 1,2,3; begin write('Введите степень многочлена '); readln(n); for i:=n downto 0 do read(e[i]); for i:=0 to n do begin a[i]:=e[i]/e[n]; b[i]:=a[i]; end; for u:=1 to n do begin l:=0; h:=1; 3: z:=1; for i:=0 to n do begin for j:=0 to n do begin k:=(i+j) div 2; if k+k=i+j then c[k]:=c[k]+a[i]*a[j]*z; end; z:=-z; end; m:=abs(c[n-1]); 1: inc(l); m1:=m; for i:=1 to l do m1:=sqrt(m1); h:=h*m1; s:=floattostr(h); if (m1=1) or (pos('0000',s)<>0) then begin if pos('0000',s)<>0 then delete(s,pos('0000',s),length(s)-pos('0000',s)+1); if length(s)<>16 then h:=strtofloat(s); z:=0; for i:=0 to n do begin mem:=power(h,i); mem:=mem*b[i]; if (i=n) then begin mem:=-mem; if floattostr(mem)=floattostr(z) then z:=0; end else z:=z+mem; end; if s[length(s)]=',' then delete(s,length(s),1); if z=0 then writeln(s) else begin writeln('-',s); h:=-h; end; t:=0; for i:=n downto 1 do begin d[i-1]:=(b[i]-t); t:=d[i-1]*(-h); end; dec(n); for i:=0 to n do begin a[i]:=d[i]; b[i]:=d[i]; c[i]:=0; end; end else begin for i:=0 to n do begin a[i]:=c[i]/power(m,(n-i)); c[i]:=0; end; goto 3; end; end; readln; readln; ----------------- Hадеюсь, хоть чем-то мог быть полезен! И, это... в следующий раз закрывайте кран! Slobodskoy Vitaly e-mail: slvv@uic.nnov.ru fido: 2:5015/128.22 --- WP/95 Rel 1.78E (215.0) Reg. * Origin: Эллипс - круг, вписанный в квадрат 2x4 ((с) военная кафедра) (2:5015/128.22) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/39085309e68b.html, оценка из 5, голосов 10
|