program assign3_2
use quadratic
implicit none
integer :: i
integer,parameter :: n=2,m=1
real :: a(n,n),b(m,n),d(m,m),e,quad1

a=reshape((/1,3,2,5/),(/n,n/))
b=reshape((/5,11/),(/m,n/))

print*,'A matrix & B'

do i=1,n
   print*,a(i,:),b(m,i)
enddo

d=matmul(matmul(b,a),transpose(b))
print*,'Matmul =',d

e=quad1(a,b,n,m)
print*,'External function :',e

e=quad2(a,b,n,m)
print*,'Internal function :',e

e=quad(a,b,n,m)
print*,'Module :',e

contains

function quad2(a,b,n,m) result(c)
integer :: n,m
real :: c,a(n,n),b(m,n),f(m,m)
f=matmul(matmul(b,a),transpose(b))
c=f(m,m)
end function
end program assign3_2

function quad1(a,b,n,m) result(c)
integer :: n,m
real :: c,f(m,m),a(n,n),b(m,n)
f=matmul(matmul(b,a),transpose(b))
c=f(m,m)
end function