Polynomial derivative: Difference between revisions

From Rosetta Code
Content added Content deleted
(julia example)
(add FreeBASIC)
Line 40: Line 40:
Derivative of -x4-x3+x+1: 1 - 3*x^2 - 4*x^3
Derivative of -x4-x3+x+1: 1 - 3*x^2 - 4*x^3
</pre>
</pre>


=={{header|FreeBASIC}}==
<lang freebasic>sub polydiff( p() as integer )
'differentiates the polynomial
'p(0) + p(1)x + p(2)x^2 +... + p(n)x^n
'in place
dim as integer i, n = ubound(p)
if n=0 then
p(0)=0
return
end if
for i = 0 to n - 1
p(i) = (i+1)*p(i+1)
next i
redim preserve p(0 to n-1)
return
end sub

sub print_poly( p() as integer )
'quick and dirty display of the poly
if ubound(p)=0 and p(0)=0 then
print 0
return
end if
for i as integer = 0 to ubound(p)
if i = 0 then print p(i);" ";
if i = 1 and p(i)>0 then print using "+ #x";p(i);
if i = 1 and p(i)<0 then print using "- #x";-p(i);
if i > 1 and p(i)>0 then print using "+ #x^#";p(i);i;
if i > 1 and p(i)<0 then print using "- #x^#";-p(i);i;
next i
print
end sub

'test cases
redim as integer p(0)
p(0) = 5
print_poly(p())
print "Differentiates to "
polydiff(p())
print_poly(p()): print

redim as integer p(1)
p(0) = 4 : p(1) = -3
print_poly(p())
print "Differentiates to "
polydiff(p())
print_poly(p()): print

redim as integer p(2)
p(0) = -1 : p(1) = 6 : p(2) = 5
print_poly(p())
print "Differentiates to "
polydiff(p())
print_poly(p()): print

redim as integer p(3)
p(0) = 4 : p(1) = 3 : p(2) = -2 : p(3) = 1
print_poly(p())
print "Differentiates to "
polydiff(p())
print_poly(p()): print

redim as integer p(4)
p(0) = 1 : p(1) = 1 : p(2) = 0 : p(3) = -1 : p(4) = -1
print_poly(p())
print "Differentiates to "
polydiff(p())
print_poly(p()): print</lang>
{{out}}<pre>
5
Differentiates to
0

4 - 3x
Differentiates to
-3

-1 + 6x+ 5x^2
Differentiates to
6 + %10x

4 + 3x- 2x^2+ 1x^3
Differentiates to
3 - 4x+ 3x^2

1 + 1x- 1x^3- 1x^4
Differentiates to
1 - 3x^2- 4x^3</pre>

Revision as of 08:53, 9 November 2021

Polynomial derivative is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

Given a polynomial, represented by an ordered list of its coefficients by increasing degree (e.g. [-1, 6, 5] represents 5x2+6x-1), calculate the polynomial representing the derivative. For example, the derivative of the aforementioned polynomial is 10x+6, represented by [6, 10]. Test cases: 5, -3x+4, 5x2+6x-1, x3-2x2+3x-4, -x4-x3+x+1

Factor

<lang factor>USING: math.polynomials prettyprint ;

{ -1 6 5 } pdiff .</lang>

Output:
{ 6 10 }

The implementation of pdiff:

<lang factor>USING: kernel math.vectors sequences ; IN: math.polynomials

pdiff ( p -- p' ) dup length <iota> v* rest ;</lang>


Julia

<lang julia>using Polynomials

testcases = [

   ("5", [5]),
   ("-3x+4", [4, -3]),
   ("5x2+6x-1", [-1, 6, 5]),
   ("x3-2x2+3x-4", [-4, 3, -2, 1]),
   ("-x4-x3+x+1", [1, 1, 0, -1, -1]),

]

for (s, coef) in testcases

   println("Derivative of $s: ", derivative(Polynomial(coef)))

end

</lang>

Output:
Derivative of 5: 0
Derivative of -3x+4: -3
Derivative of 5x2+6x-1: 6 + 10*x
Derivative of x3-2x2+3x-4: 3 - 4*x + 3*x^2
Derivative of -x4-x3+x+1: 1 - 3*x^2 - 4*x^3


FreeBASIC

<lang freebasic>sub polydiff( p() as integer )

   'differentiates the polynomial
   'p(0) + p(1)x + p(2)x^2 +... + p(n)x^n
   'in place
   dim as integer i, n = ubound(p)
   if n=0 then
       p(0)=0
       return
   end if
   for i = 0 to n - 1
       p(i) = (i+1)*p(i+1)
   next i
   redim preserve p(0 to n-1)
   return

end sub

sub print_poly( p() as integer )

   'quick and dirty display of the poly
   if ubound(p)=0 and p(0)=0 then
       print 0
       return
   end if
   for i as integer = 0 to ubound(p)
       if i = 0 then print p(i);" ";
       if i = 1 and p(i)>0 then print using "+ #x";p(i);
       if i = 1 and p(i)<0 then print using "- #x";-p(i);
       if i > 1 and p(i)>0 then print using "+ #x^#";p(i);i;
       if i > 1 and p(i)<0 then print using "- #x^#";-p(i);i;        
   next i
   print

end sub

'test cases redim as integer p(0) p(0) = 5 print_poly(p()) print "Differentiates to " polydiff(p()) print_poly(p()): print

redim as integer p(1) p(0) = 4 : p(1) = -3 print_poly(p()) print "Differentiates to " polydiff(p()) print_poly(p()): print

redim as integer p(2) p(0) = -1 : p(1) = 6 : p(2) = 5 print_poly(p()) print "Differentiates to " polydiff(p()) print_poly(p()): print

redim as integer p(3) p(0) = 4 : p(1) = 3 : p(2) = -2 : p(3) = 1 print_poly(p()) print "Differentiates to " polydiff(p()) print_poly(p()): print

redim as integer p(4) p(0) = 1 : p(1) = 1 : p(2) = 0 : p(3) = -1 : p(4) = -1 print_poly(p()) print "Differentiates to " polydiff(p()) print_poly(p()): print</lang>

Output:

5 

Differentiates to

0
4 - 3x

Differentiates to -3

-1 + 6x+ 5x^2 Differentiates to

6 + %10x
4 + 3x- 2x^2+ 1x^3

Differentiates to

3 - 4x+ 3x^2
1 + 1x- 1x^3- 1x^4

Differentiates to

1 - 3x^2- 4x^3