%A1
%a)
a=1:3:13;
b1=a<9;
b2=[ones(1,3),zeros(1,2)];

%Fehlerbehebung
b2=logical(b2);

a(b1)
a(b2)

%Fehlerbehebung
b2=logical(b2);

%b)
x=[1.2,2.2,2.3,1.7,inf,NaN,1.5,2.3,4.1,inf];
v1=isfinite(x)
v2=abs(x-2)>0.4

%c)
%endliche Einträge aus x, Std,Var,Mean
x=x(isfinite(x));
mean(x)
std(x)
var(x)
x1=x(abs(x-mean(x))<std(x))

%d)
%sortierte Matrix
A = round(rand(5,5)*1000);
a=1:1000;
A = reshape(a(ismember(a,A)),5,5)'

%e)
B = magic(6);
C = mod(B,2)==0
c1 = B(mod(B,2)==0)
%bzw c1=A(find(mod(A,2)==0))
c2 = find(mod(B,2)==0)


%A2
m = input('Von wievielen Zahlen sollen die Teiler bestimmt werden?')
b = zeros(1,m);

%a) Anzahl der Teiler der einzelnen Zahlen bestimmen
for i = 1:m
    for j = 2:i
        if(mod(i,j)==0)
            b(i)=b(i)+1;
        end
    end
end

% Anzahl der Zahlen, die mehr als 10 Teiler haben
c=0;
d=1;
for i=1:m
    if(b(i)>10)
        c(d)=i;
        d=d+1;
    end
end
c

%b) Balkendiagramm plotten
hold on
for i = 1:m
    plot([i i+1],[b(i) b(i)]);
    plot([i i], [0 b(i)]);
    plot([i+1 i+1], [0 b(i)]);
end

% c) Primzahlen bestimmen
y = 0;
k = 1;
for i = 1:m
    switch b(i)
        case{1}
            y(k)=i;
            k = k+1;
    end
end

switch isempty(y)
    case{1}
        disp('Es gibt keine Primzahlen in diesem Zahlenbereich.');
    otherwise
        y
        disp('sind Primzahlen');
end


%A3

%a)
%Der Einfachheit halber nehmen wir an Sie tippen immer auf Gerade.
%Schreiben Sie ein Skript das dieses Spiel bis zum ersten Gewinn simuliert.
%Wie viele Spiele benötigen Sie bis zum ersten Gewinn? Wie hoch ist Ihr
%Gesamtgewinn? Wie hoch ist Ihr gesamter Einsatz?


%das hier geht nur mit while, weil man nicht weiß, wann das Problem
%abbricht

einsatz = 2;
ausgabe = 2;
ergebnis = randi(37,1)-1
spiele = 1;
while(ergebnis == 0 || mod(ergebnis,2)~= 0)
    einsatz = einsatz* 2;
    ausgabe = ausgabe + einsatz;
    spiele = spiele + 1;
    ergebnis = randi(37,1) - 1;
end

einsatz
ausgabe
spiele
gewinn = 2* einsatz - ausgabe

pause

%b)
%Simulieren Sie n Spiele und berechnen Sie den Gewinn/Verlust (mithilfe
%einer for-Schleife). Entspricht der Gewinn Ihren Erwartungen? Wie hoch war Ihr
%maximaler Einsatz?

einsatz = 1;
maxeinsatz = 2;
gewinn = 0; 
n = input('Von wievielen Spielen soll der Gewinn/Verlust berechnet werden?');
tic
for i=1:n,
    einsatz = einsatz * 2;
    gewinn = gewinn - einsatz;
    zufall = randi(37,1) - 1;
    if(zufall > 0 && mod(zufall,2) == 0)
        %gewonnen
        gewinn = gewinn + 2*einsatz;
        if(maxeinsatz<einsatz)
            maxeinsatz=einsatz;
        end
        einsatz = 1;
    end
end

gewinn
maxeinsatz
toc

pause

%c)
%Nehmen Sie nun an Sie haben ein Einsatzlimit von 32 € an dem Tisch
%(verlieren Sie also bei einem Einsatz von 32 €, so gibt es 2 Möglichkeiten:
%Sie bleiben bei einem Einsatz von 32 € bis Sie gewinnen, oder sie beginnen
%von vorne mit einem Einsatz von 2 €). Wie wirkt sich dieses Limit auf Ihren
%Gewinn aus?

einsatz = 1;
gewinn = 0; 
tic
for i=1:10000,
    einsatz = einsatz * 2;
    if(einsatz > 32)
        einsatz = 2; %% oder einsatz = 32 €
    end
    gewinn = gewinn - einsatz;
    zufall = randi(37,1) - 1;
    if(zufall > 0 && mod(zufall,2) == 0)
        %gewonnen
        gewinn = gewinn + 2*einsatz;
        einsatz = 1;
    end
end
gewinn
toc

pause

%d)
%Verbessern Sie die Performance von Teil b) (durch Vermeiden von
%Schleifen).
tic
zufall = randi(37,n,1);
%in a) haben wir gesehen, dass der Gewinn immer gleich dem Einsatz ist!
% d.h. wir zählen die Anzahl der Gewinne und ziehen am Ende noch die
% (möglichen) Verluste der letzen Spiele ab:
gewinne = sum(zufall>0 & mod(zufall,2) == 0) * 2 - (2^(n - find(zufall > 0 & mod(zufall,2) == 0,1,'last') + 1) - 1)
toc
%das find gibt die letzte Position eines Gewinnes an. Damit haben wir am
%Ende n - find mal verloren d.h. wir verlieren 2,2^2,2^3,...,2^(n-find),
%aufsummiert ergibt das 2^(n-find+1) - 1

pause

%e)
%Verbessern Sie nun auch die Performance von c) (für den Fall, dass wir
%nach einem Einsatz von 32 wieder von vorne beginnen)

tic 
einsatz = 1:n; %also zweierpotenzen, d.h wir gehen zunächst davon aus, dass wir nie gewinnen!
zufall = randi(37,n,1);
gewinnposition = zufall>0 & mod(zufall,2) == 0; %das hier ist eine logische matrix
gewinnpositionsnummer = einsatz(gewinnposition);
%nun erzeugen wir einen Vektor der nach dem Gewinn die entsprechende
%Zweierpotens vom einsatz hat und ziehen diese voneinander ab...
gewinnecumuliert = cumsum(gewinnposition);
einsatzreset = gewinnpositionsnummer(gewinnecumuliert(gewinnecumuliert>0));
einsatz = einsatz - [zeros(1,einsatzreset(1)), einsatzreset(1:n-einsatzreset(1))];
% jetzt müssen noch einsätze > 5 rausgeworfen werden:
einsatz(einsatz>5) = mod(einsatz(einsatz>5) - 6,5)+1;
gewinn = sum(2.* (2.^einsatz(gewinnposition))) - sum(2.^einsatz)
toc


%A4
%a)
f=[-1 0 0 0 1 0 -3];
g=[1 2 -1 1];

%Summe
s=f+[0 0 0 g];
%Produkt
p=conv(f,g);
%Quotient mit Rest
[q,r]=deconv(f,g);

%b)
h = [-1 16 -95 260 -324 144];
%Nullstellen und Extremstellen
nst=roots(h);
dh=polyder(h);
ext=roots(dh);
%graphische Darstellung im Bereich der kleinsten und größten Nullstelle
x = linspace(min(nst),max(nst));
plot(x,polyval(h,x));
%Markierung der Nullstellen und Extremstellen
hold on
plot(nst,0,'*');
plot(ext,polyval(h,ext),'*');

% Zusatzaufgaben

%A4 
%a)
M = rand(6,6)

disp('charakteristisches Polynom von M:')
cp1=poly(M)

disp('Cayley-Hamilton:')
polyvalm(cp1,M)

%b)
N = rand(6,6)

disp('1. Auswertung mit N^10:')
N^10

disp('2. Auswertung über Ersatzpolynom von p(x)=x^10:')

cp2 = poly(N);
bc = [1, zeros(1,10)];
[q,r] = deconv(bc,cp2);
polyvalm(r,N)

%A5 klar


