Aufgabe 3.1

transpose[m_]:=Table[m[[All,i]],{i,Length[m[[1]]]}]

Eine Matrix ist eine Liste von Zeilen. Table erzeugt hier eine neue Liste, deren Elemente die Spalten von m sind.

transpose[{{2,3,4,5},{3,4,5,6},{4,5,6,7}}]

Dasselbe Ergebnis erhält man auch mit einer Schleifenkonstruktion wie dieser:

transpose[m_]:=Block[{
a=Table[0,{i,Length[m[[1]]]}], (* Variable für das Resultat vorbereiten *)
i (* Laufvariable für die For-Schleife *)
},
For[i=1,i≤Length[m[[1]]],i++,
a[[i]]=m[[All,i]];
];
a]

Das letzte a gibt dem Block einen Resultatwert, dieser ist dann auch der Resultatwert der Funktion.

Aufgabe 3.2

polynom[v_,x_]:=Apply[Plus,MapIndexed[#1*(x^(#2[[1]]-1))&,v]]

MapIndexed verwendet die Listenelemente als Koeffizienten und ihre Indizes als Exponenten in der puren Funktion #1*(x^(#2[[1]]-1))&. Das Apply[Plus,...] addiert die Summanden noch auf.

polynom[{3,2,1},t]

Aufgabe 3.3

Mit funktionalen Mitteln:

mod[a_Integer,b_Integer]/;a≥0&&b>0:=NestWhile[#-b&,a,#>=b&]

Oder prozedural:

mod[a_Integer,b_Integer]/;a≥0&&b>0:=Block[
{a1=a}, (* Funktionsparameter kann man nicht verändern *)
While[a1≥b,
a1-=b; (* kurz für a1=a1-b *)
];
a1]

Aufgabe 3.4

ggt[0,b_]:=b

ggt[a_,b_]:=Block[{
a1=a,
b1=b},
While[b1≠0,
If[a1>b1,
a1-=b1,
b1-=a1
]];
a1]

ggt[14,35]

Aufgabe 3.5

Die Funktion iteriert über alle Elemente von v und zählt dabei aufeinanderfolgende Vorkommen von x. Resultat der Funktion ist die Liste {maxstart,maxcount} am Ende von Block.

find[v_List,x_]:=Block[{
start=0,
count=0,
maxstart=0,
maxcount=0,
i},
Do[ (* Iteration über v *)
If[v[[i]]==x, (* ein x gefunden *)
If[start==0, (* ist es das erste? *)
start=i; (* beginne zu zählen *)
count=1,
(* else: start≠0 *)
count++ (*weiterzählen *)
], (* end if start==0 *)
(* else: v[[i]]≠x *)
If[start≠0, (* erstes Element nach einer Sequenz von x *)
If[count>maxcount, (* die gerade gesehene Sequenz war länger als die bisher längste *)
maxstart=start;
maxcount=count
]; (* end if count>maxcount *)
start=0;
count=0
] (* end if start≠0 *)
] ,(* end if v[[i]]==x *)
{i,Length[v]}]; (* end do i *)
If[start≠0 &&  count>maxcount, (* evtl. war die längste Sequenz am Ende von v *)
maxcount=count;
maxstart=start
];
{maxstart,maxcount}
]

Aufgabe 3.6

eratosthenes[n_]:=Block[{
a=Range[n],
i,j
},
Do[ (* laufe über alle Elemente von a *)
If[a[[i]]≠0, (* Primzahl gefunden *)
Do[ (* streiche alle Vielfachen von a[[i]] *)
a[[j]]=0,
{j,2 i,n,i}] (* end do j *)
] ,(* end if a[[i]]≠0 *)
{i,2,n}]; (* end do i *)
Select[a,#≠0&] (* Resultat: alle Elemente von a, die ≠0 sind *)
]

eratosthenes[100]

Aufgabe 3.7
a)

NestWhile[#-((((#)^3)-2)/(3 ((#)^2)))&,0.9,Abs[((#)^3)-2]>(10^(-5))&]

b)

g[x_]:=(x^3)-2

newton[f_,s_,y_]:=NestWhile[#-((f[#])/(f'[#]))&,s,Abs[f[#]]>y&]

newton[g,2.5,(10^(-6))]