% Document Type: LaTeX
% Master File: algcurve.tex
% ---------------------------------------------
%   Hauptfile der Projektdokumentation (Liz)   |
% ---------------------------------------------
\documentstyle[12pt,twoside,dina4,amssym,german]{darticle}

% Master File: algcurve.tex

\newlength{\sahook}
\setlength{\sahook}{0.3em}
%
\newcounter{countanything}[section]

%
% Theorem
% -------
%
\newenvironment{theorem}%
   {\addtocounter{countanything}{1}\medskip\noindent\normalsize\bf
    \arabic{section}.\arabic{countanything} Theorem\hspace{\sahook}\it}%
   {\rm\par\medskip}
\newenvironment{thblock}[1]%
   {\addtocounter{countanything}{1}\medskip\noindent\normalsize\bf
    \arabic{section}.\arabic{countanything} #1\hspace{\sahook}\it}%
   {\rm\par\medskip}
%
% Satz
% ----
%
\newenvironment{satz}%
   {\addtocounter{countanything}{1}\medskip\noindent\normalsize\bf
    \arabic{section}.\arabic{countanything} Satz\hspace{\sahook}\it}%
   {\rm\par\medskip}
%
% Lemma
% -----
%
\newenvironment{lemma}%
   {\addtocounter{countanything}{1}\medskip\noindent\normalsize\bf
    \arabic{section}.\arabic{countanything} Lemma\hspace{\sahook}\it}%
   {\rm\par\medskip}
%
% Korollar
% --------
%
\newenvironment{korollar}%
   {\addtocounter{countanything}{1}\medskip\noindent\normalsize\bf
    \arabic{section}.\arabic{countanything} Korollar\hspace{\sahook}\it}%
   {\rm\par\medskip}
%
% Definition
% ----------
%
\newenvironment{definition}%
   {\addtocounter{countanything}{1}\medskip\noindent\normalsize\bf
    \arabic{section}.\arabic{countanything} Definition\hspace{\sahook}\rm}%
   {\rm\par\bigskip}
\newenvironment{defblock}[1]%
   {\addtocounter{countanything}{1}\medskip\noindent\normalsize\bf
    \arabic{section}.\arabic{countanything} #1\hspace{\sahook}\rm}%
   {\rm\par\medskip}
%
% Beweis
% ------
%
\newenvironment{beweis}%
   {\par\medskip\noindent\normalsize\bf
    Beweis\hspace{\sahook}\rm}%
   {\rm \hfill $\Box$ \par\bigskip }
\newenvironment{bewblock}[1]%
   {\par\medskip\noindent\normalsize\bf
    #1\hspace{\sahook}\rm}%
   {\rm}
%
% Bemerkung
% ---------
%
\newenvironment{bemerkung}%
   {\addtocounter{countanything}{1}\medskip\noindent\normalsize\bf
    \arabic{section}.\arabic{countanything} Bemerkung\hspace{\sahook}\rm}%
   {\rm\par\medskip}
%
% Beispiel
% --------
%
\newenvironment{beispiel}%
   {\addtocounter{countanything}{1}\medskip\noindent\normalsize\bf
    \arabic{section}.\arabic{countanything} Beispiel\hspace{\sahook}\rm}%
   {\rm\par\medskip}
%
%
% Seitenformat/Standardvorgaben
% -----------------------------
%
%
%\textheight 200mm
%\textwidth 135 mm
%\oddsidemargin 12.5mm
%\evensidemargin 12.5mm
%\topmargin 10mm
%\footskip 17mm
%\parskip 2.5ex plus 0.5ex minus 0.5ex
%\medskipamount 1.5ex plus 0.5ex minus 0.5ex
%\parindent 0mm
%\renewcommand{\baselinestretch}{1.25}
%
%
% enumerate-Umgebungen ohne Einrueckungen
% -------------------------------------
%
%
\newcounter{enumgjcount}
\newcounter{enumgjcount2}
%
% Abstand am Ende: \parskip
\newenvironment{enumgj}%
{ \begin{list}%
  {\arabic{enumgjcount}.}%
  {\usecounter{enumgjcount}
   \settowidth{\labelwidth}{9.}
   \setlength{\leftmargin}{\labelwidth}
   \addtolength{\leftmargin}{\labelsep}
   \setlength{\rightmargin}{0mm}
   \setlength{\topsep}{\itemsep}
   \addtolength{\topsep}{\parsep}
   \addtolength{\topsep}{-\parskip}
   \setlength{\partopsep}{0mm}}}%
{\vspace{-\topsep}\end{list}}
%
%
% Abstand am Ende: \labelsep + \parsep
\newenvironment{enumgj2}%
{ \begin{list}%
  {\arabic{enumgjcount2}.}%
  {\usecounter{enumgjcount2}
   \settowidth{\labelwidth}{9.}
   \setlength{\leftmargin}{\labelwidth}
   \addtolength{\leftmargin}{\labelsep}
   \setlength{\rightmargin}{0mm}
   \setlength{\topsep}{\itemsep}
   \addtolength{\topsep}{\parsep}
   \addtolength{\topsep}{-\parskip}
   \setlength{\partopsep}{0mm}}}%
{\end{list}}
%
%
%
% enumerate Umgebung ohne Einrueckungen, mit geklammerter Nummerierung
% -------------------------------------------------------------------
%
%
\newcounter{enumgjparcount}
\newcounter{enumgjparcount2}
%
% Abstand am Ende: \parskip
\newenvironment{enumgjpar}%
{ \begin{list}%
  {(\arabic{enumgjparcount})}%
  {\usecounter{enumgjparcount}
   \settowidth{\labelwidth}{(9)}
   \setlength{\leftmargin}{\labelwidth}
   \addtolength{\leftmargin}{\labelsep}
   \setlength{\rightmargin}{0mm}
   \setlength{\topsep}{\itemsep}
   \addtolength{\topsep}{\parsep}
   \addtolength{\topsep}{-\parskip}
   \setlength{\partopsep}{0mm}}}%
{\vspace{-\topsep}\end{list}}
%
%
% Abstand am Ende: \labelsep + \parsep
\newenvironment{enumgjpar2}%
{ \begin{list}%
  {(\arabic{enumgjparcount2})}%
  {\usecounter{enumgjparcount2}
   \settowidth{\labelwidth}{(9)}
   \setlength{\leftmargin}{\labelwidth}
   \addtolength{\leftmargin}{\labelsep}
   \setlength{\rightmargin}{0mm}
   \setlength{\topsep}{\itemsep}
   \addtolength{\topsep}{\parsep}
   \addtolength{\topsep}{-\parskip}
   \setlength{\partopsep}{0mm}}}%
{\end{list}}
%
%
%

% enumerate ohne Einrueckungen, mit Buchstaben
% --------------------------------------------
%
\newcounter{enumgjlettcount}
\newcounter{enumgjlettcount2}
%
% Abstand am Ende: \parskip
\newenvironment{enumgjlett}%
{ \begin{list}%
  {\alph{enumgjlettcount})}%
  {\usecounter{enumgjlettcount}
   \settowidth{\labelwidth}{a)}
   \setlength{\leftmargin}{\labelwidth}
   \addtolength{\leftmargin}{\labelsep}
   \setlength{\rightmargin}{0mm}
   \setlength{\topsep}{\itemsep}
   \addtolength{\topsep}{\parsep}
   \addtolength{\topsep}{-\parskip}
   \setlength{\partopsep}{0mm}}}%
{\vspace{-\topsep}\end{list}}
%
%
% Abstand am Ende: \itemsep + \parsep
\newenvironment{enumgjlett2}%
{ \begin{list}%
  {\alph{enumgjlettcount2})}%
  {\usecounter{enumgjlettcount2}
   \settowidth{\labelwidth}{a)}
   \setlength{\leftmargin}{\labelwidth}
   \addtolength{\leftmargin}{\labelsep}
   \setlength{\rightmargin}{0mm}
   \setlength{\topsep}{\itemsep}
   \addtolength{\topsep}{\parsep}
   \addtolength{\topsep}{-\parskip}
   \setlength{\partopsep}{0mm}}}%
{\end{list}}
%
%
%
%
% enumerate Umgebung ohne Einrueckungen, mit geklammerten Buchstaben
% -------------------------------------------------------------------
%
%
\newcounter{enumgjlettparcount}
\newcounter{enumgjlettparcount2}
%
% Abstand am Ende: \parskip
\newenvironment{enumgjlettpar}%
{ \begin{list}%
  {(\alph{enumgjlettparcount})}%
  {\usecounter{enumgjlettparcount}
   \settowidth{\labelwidth}{(a)}
   \setlength{\leftmargin}{\labelwidth}
   \addtolength{\leftmargin}{\labelsep}
   \setlength{\rightmargin}{0mm}
   \setlength{\topsep}{\itemsep}
   \addtolength{\topsep}{\parsep}
   \addtolength{\topsep}{-\parskip}
   \setlength{\partopsep}{0mm}}}%
{\vspace{-\topsep}\end{list}}
%
%
% Abstand am Ende: \labelsep + \parsep
\newenvironment{enumgjlettpar2}%
{ \begin{list}%
  {(\alph{enumgjlettparcount2})}%
  {\usecounter{enumgjlettparcount2}
   \settowidth{\labelwidth}{(a)}
   \setlength{\leftmargin}{\labelwidth}
   \addtolength{\leftmargin}{\labelsep}
   \setlength{\rightmargin}{0mm}
   \setlength{\topsep}{\itemsep}
   \addtolength{\topsep}{\parsep}
   \addtolength{\topsep}{-\parskip}
   \setlength{\partopsep}{0mm}}}%
{\end{list}}
%
%
%
%
% case-Umgebungen
% ---------------
%
%
\newcounter{casecount}
\newcounter{casecount2}
%
%
% Abstand am Ende: \parskip
\newenvironment{case}%
{ \begin{list}%
  {\it\hspace{\labelwidth}\hspace{\labelsep}\arabic{casecount}. Fall.\quad\rm}%
  {\usecounter{casecount}
   \settowidth{\labelwidth}{9. Fall.\quad}
   \setlength{\leftmargin}{0mm}
   \setlength{\rightmargin}{0mm}
   \setlength{\topsep}{\itemsep}
   \addtolength{\topsep}{\parsep}
   \addtolength{\topsep}{-\parskip}
   \setlength{\partopsep}{0mm}}}%
{\vspace{-\topsep}\end{list}}
%
%
% Abstand am Ende: \itemsep + \parsep
\newenvironment{case2}%
{ \begin{list}%
  {\it\hspace{\labelwidth}\hspace{\labelsep}\arabic{casecount2}. Fall.\quad\rm}%
  {\usecounter{casecount2}
   \settowidth{\labelwidth}{9. Fall.\quad}
   \setlength{\leftmargin}{0mm}
   \setlength{\rightmargin}{0mm}
   \setlength{\topsep}{\itemsep}
   \addtolength{\topsep}{\parsep}
   \addtolength{\topsep}{-\parskip}
   \setlength{\partopsep}{0mm}}}%
{\end{list}}
%
%
% Widerspruch !
% -------------
%
\newcommand{\contradiction}{\rm Widerspruch !}
%
%

%
% label - Setzung zu den Umgebungen
%

\makeatletter                         % from 'latex.tex'
\def\mylabel#1{\@bsphack\if@filesw {\let\thepage\relax
   \def\protect{\noexpand\noexpand\noexpand}%
\xdef\@gtempa{\write\@auxout{\string
      \newlabel{#1}{{\thesection.\thecountanything}{\thepage}}}}}\@gtempa
   \if@nobreak \ifvmode\nobreak\fi\fi\fi\@esphack}
\makeatother                          % from 'latex.tex'


% Master File: algcurve.tex
% --------------------------------------------------------
% Definitionen und Makros zur Projektdokumentation (Liz) | 
% --------------------------------------------------------
%

%
% *****  Trenn-Liste  ****
%
\hyphenation{Ko-ef-fi-zi-ent Ko-ef-fi-zi-ent-en Ko-or-di-na-te}


%
% *****  allgemeine Abkuerzungen
%

\newcommand{\name}{\mbox{\tt algcurve}}
\newcommand{\maple}{{\sc Maple}}

%\input mssymb
\newcommand\N{{\Bbb N}}
\newcommand\Z{{\Bbb Z}}
\newcommand\Q{{\Bbb Q}}
\newcommand\R{{\Bbb R}}
\newcommand\C{{\Bbb C}}

\newcommand\Cx{\C[x]}                    % Polynomringe
\newcommand{\Cxx}{\C[x_0,x_1,x_2]}
\newcommand{\Cxk}[1]{\C[x_0,\dots,x_#1]}
\newcommand{\Cxy}{\C[x,y]}

\newcommand\PC[1]{P_#1(\C)}              % projektiver Raum ueber C
\newcommand\GL[1]{\hbox{GL}(#1,\C)}      % General Linear
\newcommand\PGL[1]{\hbox{PGL}(#1,\C)}    % Projective General Linear

\newcommand\myvec[1]{\left( \begin{array}c #1 \end{array}\right)}

\newcommand\Dp[2]{\frac{\partial #1}{\partial x_#2}}  % Funktion part. nach x_i
\newcommand\bew[1]{\begin{beweis} \cite[#1]{BK} \end{beweis}}

% *****  mathematische Abkuerzungen

% Falls Behandlung als Operator wie lim Integral etc -> mathop
%                      normale Abk.                  -> hbox

\def\id{\hbox{Id}}
\def\harps{\mathop \rightleftarrows} %..harpoons


%
% *****  Umgebung zum Import von Programmstuecken
%
\newenvironment{inprog}%
{\begin{quote}\renewcommand{\baselinestretch}{1} \footnotesize}%
{\end{quote}}

\newenvironment{indoc}%
{\begin{quote}\renewcommand{\baselinestretch}{1} \scriptsize}%
{\end{quote}}

%
% *****  Umgebungen zur Beschreibung von Prozeduren
%

\newenvironment{paralist}%
{ \begin{list}%
  {\hfill}%
  { \addtolength{\labelwidth}{6ex}
    \addtolength{\labelsep}{1ex}
    \addtolength{\leftmargin}{\leftmargin}
    \addtolength{\leftmargin}{7ex}
    \itemsep0ex plus0.2ex 
      }}%
{\end{list}}

%  {\settowidth{\labelwidth}{#1} % setzt labelwidth auf Breite von #1 (als Wort)

\newcommand{\opt}{\hspace{1ex}{\small\sl (optional)\/}}
\newcommand{\pitem}[1]{\item[{\tt #1}\hfill~:]}
\newcommand{\ttsub}[1]{_{\hbox{\tt\small #1}}}

\newenvironment{kopf}[1]%
{{\bf Kopf :}\hspace{3ex}{\tt #1}%
\begin{paralist}}%
{\end{paralist}}

\newenvironment{zweck}%
{{\bf Funktion :}\vspace{-1.5ex}\begin{quote}}%
{\end{quote}}

\newenvironment{algo}%
{{\bf Algorithmus :}\\ }%
{\hfill $\diamond$ \par\bigskip} %

\newenvironment{code}%
{{\bf Code :}\tt\small}%
{\par\medskip}

\newcommand{\quer}[1]%
{{\bf Vergleiche :}\hspace{3ex}{#1} \par \medskip}



%
%
% *****  Makro zum Import von Postscript-Graphiken
%
\newcommand{\ingraph}[4]%
{\begin{figure}[hbtp]
    \originalTeX
    \centerline{\ \psfig{figure=#1,height=#2}\ }
    \germanTeX
    \caption{#3}
    \label{#4}
 \end{figure}}

\newcommand{\framedingraph}[4]%
{\begin{figure}[hbtp]
    \originalTeX
    \centerline{\fbox{\ \psfig{figure=#1,height=#2}\ }}
    \germanTeX
    \caption{#3}
    \label{#4}
 \end{figure}}


\newcommand{\framedgraph}[3]%
{   \originalTeX
    \fbox{\ \psfig{figure=#1,height=#2,width=#3}\ }
    \germanTeX
}

\newcommand{\figgraph}[3]%
{\begin{figure}[hbtp]
    \centerline{\input{#1}}
    \caption{#2}
    \label{#3}
 \end{figure}}








\parindent0em
\oddsidemargin21.22636pt
\evensidemargin7.22636pt


% Master File: algcurve.tex


\pagestyle{empty}
\thispagestyle{empty}
%\begin{titlepage}
\begin{center}
  \vspace*{3cm}
  {\Large\sc Ein Softwarepaket f"ur die \\
             algebraische, projektive Geometrie \\[0.7ex]
             in \maple }

  \vspace{3cm}
{\Large Lizentiatsarbeit an der Universit"at Bern }\\[3ex]
bei\\[3ex]
{\bf Prof.~Dr.~Gerhard J"ager}\\[7ex]
von\\[3ex]
{\bf Stefan Schwendimann\\ Holzackerstr.~22 \\ 3123 Belp\\ }
  \vspace{3.5cm}
 Die Arbeit wurde erstellt am \\
Institut f"ur angewandte Mathematik \\ der Universit"at Bern (IAM) 
 \\[3ex]
Bern, 24.~Juli 1992

\end{center}
%\end{titlepage}


\cleardoublepage
\pagestyle{plain}
\pagenumbering{roman}

\vspace*{3cm}
\begin{center}
\large Ein Softwarepaket f"ur die \\
       algebraische, projektive Geometrie \\
       in \maple
\end{center}

\vspace{2cm}
\centerline{\bf Zusammenfassung}

\medskip

Das vorliegende Dokument beschreibt das Programmpaket \name, welches im Rahmen
einer Lizentiatsarbeit erstellt wurde. \name\ ist eine Sammlung von
\maple--Routinen, die eine einfache Handhabung von ebenen, algebraischen Kurven
in der komplexen projektiven Ebene $\PC{2}$ mit \maple\ erm"oglichen. 
Im Vordergrund stehen grunds"atzliche Funktionen, die prinzipiell f"ur Kurven
{\it beliebigen\/} Grades anwendbar sind, beispielsweise der Schnitt von
Kurven, Berechnung von Singularit"aten, Wendepunkten, Tangenten etc. 


\newpage
\tableofcontents  
\cleardoublepage
\pagenumbering{arabic}

\pagestyle{headings}


\begin{document}

% Master File: algcurve.tex

\section{Einleitung}

\subsection{Allgemeine Vorbemerkungen}

\subsubsection{Theorie} 
Gem"a"s Vorgabe (vgl.~Projektauftrag) wird vorausgesetzt, da"s der Benutzer
mit den Zusammenh"angen und Begriffen im Gebiet der projektiven Geometrie
vertraut ist. Gute Einf"uhrungen sind z.B.~in den B"uchern
\begin{itemize}
  \item {\it Ebene algebraische Kurven\/} von E.~Brieskorn \& H.~Kn"orrer
(\cite{BK}) 

  \item {\it Plane Algebraic Curves\/} (\cite{BKe}) \quad (englische
"Ubersetzung) 

  \item {\it Algebraic Curves\/} von R.~J.~Walker (\cite{Wa})
\end{itemize}

zu finden. Diese beiden B"ucher, respektive Teile davon, dienen auch als
Grundlage des Programmpakets. Referenz f"ur Bezeichnungen und Definitionen ist
\cite{BK}. Die Beweise von S"atzen werden, sofern nicht f"ur das Verst"andnis
der Algorithmen wichtig, weggelassen; es wird jedoch immer auf die
entsprechenden Stellen in der Literatur verwiesen, in den meisten F"allen nach
\cite{BK}, f"ur einige Ausnahmen nach \cite{Wa}. Im Falle von \cite{BK} werden
Abschnitts-- resp.~Satznummern und keine Seitenzahlen angegeben, da letztere
in Originalausgabe und "Ubersetzung nicht "ubereinstimmen.

Die Definitionen und S"atze sind jeweils nicht in der allgemeinst m"oglichen
Form formuliert~: anstelle von `faktorieller Ring', `K"orper',
`Integrit"atsbereich' etc.~wird der anzuwendende Fall eingesetzt ($\C,\C[x],etc.$).

\subsubsection{Skizzen und Beispiele}
Auf Skizzen und Beispiele zu Definitionen und S"atzen wird weitgehend
verzichtet. Solche sind vor allem im ersten der oben genannten B"ucher in
gro"ser Zahl vorhanden. Selbstverst"andlich werden aber die Prozeduren
ausf"uhrlich mit Beispielen dokumentiert (siehe dazu die Help--Files).

\subsubsection{Abschnittaufbau}
Bis auf die Einleitung werden alle Abschnitte nach einheitlichem Muster
aufgebaut. Zu Beginn jedes Abschnittes werden die ben"otigten Definitionen und
die wichtigsten S"atze  vorgestellt. Dann wird die getroffene Auswahl der
implementierten Funktionen begr"undet und auf Ausbaum"oglichkeiten hingewiesen.
Falls zentrale Funktionen nicht realisierbar sind, werden die Schwierigkeiten
beschrieben.

\medskip
F"ur die Beschreibung der Prozeduren in dieser Dokumentation wird in Anlehnung
an die Help--Files die folgende Struktur verwendet~:
\pagebreak

\bigskip
\begin{kopf}{procname(parameter)}
 \pitem{parameter} Beschreibung der Parameter.
\end{kopf}
\begin{zweck} 
Knappe Beschreibung der Funktion sowie des Resultates.
\end{zweck}
\begin{algo}
Beschreibung des verwendeten Algorithmus, ev.~mit zus"atzlicher Theorie.
\end{algo}
\begin{code}\\
{\rm\normalsize Zentraler Teil des implementierten Codes.}
\end{code}
% \quer{Hinweise auf verwandte Prozeduren}


\bigskip

Einzelne Punkte k"onnen weggelassen werden, sofern sich eine Angabe er"ubrigt
(z.B. Algorithmus). Mit Ausnahme des Abschnitts {\bf Code} wird in der
Beschreibung der einzelnen Punkte ein Bezug auf die konkrete Impementierung
vermieden. Im besonderen werden f"ur die Parameter keine \maple--Datentypen
angegeben~: z.B.~steht nur `Homogene Koordinate' anstelle des gew"ahlten
\maple--Typs `{\tt list}'. Es werden ausserdem keine Listen der m"oglichen
Aufrufsequenzen angegeben. Welche Kombinationen von optionalen Parametern
zul"a"sig sind, ist den Help--Files zu entnehmen.  

Im gleichen Sinne werden im Abschnitt {\bf Algorithmus} keine Details der
technischen Realisierung dargelegt. Dies erleichtert "Anderungen und f"ordert
die Lesbarkeit. Sofern die gleiche Methode verwendet wird, braucht im Falle
der Neuimplementierung einer Funktion  nur der entsprechende Abschnitt
{\bf Code} angepa"st zu werden.


\subsection{Konzept}

\subsubsection{Grunds"atze}
\begin{itemize}
  \item Es gibt keine spezielle Behandlung von Kurven eines bestimmten Grades
wie z.B.~Quadriks, Kubiks etc., es sei denn, dies diene zur Abk"urzung
eines Verfahrens. In erster Linie werden Funktionen implementiert, die auf
Kurven {\it beliebigen\/} Grades anwendbar sind.  

  \item Wo m"oglich, wird auf bestehende Datenstrukturen zur"uckgegriffen,
f"ur welche Grundmanipulationen bereits existieren. Ausserdem erh"oht sich ---
beabsichtigt oder unbeabsichtigt --- die Kompatibilit"at zu anderen Paketen.

  \item Es werden keine Prozeduren implementiert, die von allgemeinem
algebraischen Charakter sind, wie z.B.~L"osung von homogenen
Gleichungssystemen, Faktorisierung von Polynomen aus $\Cx$, Irreduzibilit"at
und "ahnliches.  Falls solche Funktionen f"ur eine Prozedur ben"otigt werden,
wird die entsprechende Form resp.~Eigenschaft vorausgesetzt.
\end{itemize}

\subsubsection{Kompatibilit"at}
\begin{itemize}
  
  \item {\tt projgeom}~: Im \maple-Paket {\tt projgeom} sind drei Datentypen
definiert:~{\tt point, line, conic}. Prinzipiell w"are eine Weiterf"uhrung
dieses Systems durch Erweiterung mit Typen {\tt cubic, quartic, quintic}
etc.~m"oglich. Der Nachteil best"unde darin, da"s der Grad beschr"ankt bliebe.
Im weiteren sind die Kurven in Form von Koeffiziententupeln abgelegt. F"ur
solche Tupel existieren jedoch keine allgemeinen Grundfunktionen wie
Polynomaddition und --multiplikation, Differentiation etc. Es gibt keinen
Grund, dies alles f"ur Tupel neu zu definieren. F"ur Polynome hingegen
existieren zahlreiche Hilfsmittel, einige davon speziell f"ur den
multivariaten Fall. Die Kompatibilit"at zu {\tt projgeom} ist 
durch eine Koeffizientenextraktionsfunktion, die ohnehin erforderlich ist,
sichergestellt (vgl.~Abschnitt \ref{coeffextract}).  

  \item {\tt linalg}~: durch Wahl von {\tt list} als Datenstruktur f"ur
homogene (und affine) Koordinaten (vgl.~\ref{homaffcoord}) wird ein hohes Ma"s
an Kompatibilit"at zum Paket f"ur lineare Algebra erreicht. Dadurch steht eine
gro"se Zahl von Funktionen zur Verf"ugung, die bei anderen Datenstrukturen
erst erstellt werden m"u"sten, z.B.~{\tt add, multiply, vectdim} etc.  Da in
der projektiven Geometrie Koordinatentransformationen zu den
Grundbed"urfnissen z"ahlen, bietet sich dazu der Typ {\tt matrix} an, f"ur
welchen wiederum umfassende Hilfsmittel zur Verf"ugung stehen. Ein weiterer
Vorteil besteht darin, da"s die meisten Benutzer mit diesen Strukturen bereits
vertraut sein d"urften.  \item {\tt solve}~: einige der wichtigsten Funktionen
basieren auf der L"osung von Gleichungssystemen mit homogenen, aber auch
affinen Polynomen, so z.B.~die Bestimmung von Schnittpunkten oder die
Berechnung von Singularit"aten.  Durch Verwendung von {\tt solve} ist
sichergestellt, da"s immer die jeweils besten in \maple\ verf"ugbaren
Algorithmen zum Einsatz gelangen.
\end{itemize}

\subsubsection{Dimension}

Es erfolgt keine Beschr"ankung der (projektiven) Dimension auf 2, wenn
dies nicht unbedingt erforderlich ist. Im speziellen stehen die
Datenstrukturen f"ur eine Ausdehnung auf h"ohere Dimensionen offen. Dies
wird sogar explizit verwendet, indem Koeffiziententupel homogener Polynome als
Punkte in hochdimensionalen projektiven R"aumen betrachtet werden. Da die
S"atze in der verwendeten Literatur aber effektiv oft auf $\PC{2}\/$ beschr"ankt
sind, werden in vielen F"allen die Funktionsargumente (vorsichtshalber)
ebenfalls beschr"ankt, es sei denn, die Ausdehnung einer Methode sei
offensichtlich m"oglich.

\subsubsection{Parameter} 
Die Anzahl Parameter bei Prozedur-Aufrufen ist aus praktischen Gr"unden
m"oglichst klein gehalten. Nur in begr"undeten F"allen werden mehr als vier
verwendet. Um die Benutzerfreundlichkeit zu erh"ohen, werden immer, wenn dies
sinnvoll m"oglich ist, optionale Parameter eingesetzt, jedoch nie mehr als
zwei. So gibt es im allgemeinen nicht mehr als drei Eingabevarianten.

\bigskip
Im \maple--Code werden die folgenden Regeln angewandt~: 
\begin{itemize}
  \item  Feste Parameter werden im Prozedurkopf aufgef"uhrt.
  \item  Optionale Parameter werden in der Analyse der Eingabevarianten
entsprechenden lokalen Variablen zugewiesen. 
  \item Ist f"ur einen festen Parameter eine lokale Kopie notwendig, so
erh"alt diese den Namen des festen Parameters mit einem vorangestellten `{\tt
l}'.
\end{itemize}



\subsubsection{homogen versus affin}
Grunds"atzlich sollen affine Polynome in 2 Variablen den adjungierten
homogenen Polynomen in 3 Variablen gleichgestellt sein, wenigstens wenn der
Aufwand nicht unverh"altnism"a"sig ist. Priorit"at haben im Zweifelsfalle die
L"osungen f"ur den homogenen Fall.


% Master File: algcurve.tex
\section {Allgemeine Grundlagen}

Auf allgemeine algebraischen Definitionen und S"atze (z.B.~"uber Polynomringe)
wird nicht eingegangen. Im folgenden Abschnitt werden lediglich die
wichtigsten Eigenschaften des `Arbeitsbereiches' $\,\C,\,\Cx,\,\Cxx$
aufgelistet.

\bigskip

\begin{enumerate}
  \item $\Cx,\Cxx\/$ sind {\it faktoriell\/}, d.h.
\begin{enumerate}
  \item Bis auf Reihenfolge und Multiplikation mit Einheiten existiert f"ur
jedes Element eine eindeutige Zerlegung in irreduzible Faktoren.
  \item Jedes irreduzible Element ist prim.
  \item Je zwei von 0 verschiedene Nicht-Einheiten besitzen einen gr"o"sten gemeinsamen Teiler. 
\end{enumerate}
  \item $\C\/$ ist algebraisch abgeschlossen (Fundamentalsatz der Algebra),
d.h.~f"ur jedes $f \in \Cx,\; f\neq 0$, existiert eine eindeutig bestimmte
Menge von Konstanten $a_1,\ldots,a_n$, die nicht notwendigerweise verschieden
sind, soda"s 
\[ f(x) = a(x-a_1)\cdots(x-a_n) \qquad a \in \C,\; a \neq 0 \]
\end{enumerate}

Bemerkung zu Zerlegung in faktoriellen Ringen~: Polynome aus
$\C[x_1,\ldots,x_k]\/$ k"onnen  im Gegensatz  zu Polynomen aus
$\Z[x_1,\ldots,x_k]\/$ und $\Q[x_1,\ldots,x_k]\/$ nicht in endlich vielen
Schritten zerlegt werden.  Damit ist auch die Irreduzibilit"at nicht in
endlich vielen Schritten festzustellen. Vergleiche dazu  \cite[4.2]{BK}
und die darin angegebenen Referenzen.


\subsection {Homogene Polynome}

\begin{definition}\\
Sei $f\/$ das Polynom
\[ f = a_0x^n + a_1x^{n-1} + \cdots + a_n \qquad a_i \in \C,\; a_0 \neq 0 \]
Dann hei"st $n\/$ der {\it Grad\/} von $f$. 

Ist $f\/$ ein Polynom in mehreren Variablen, so bezeichnet der Grad eines Monomes
von $f\/$ die Summe der Potenzen der im Monom auftretenden Variablen. Der {\it
Grad\/} von $f\/$ ist dann der gr"o"ste Grad seiner Monome.
\end{definition}

\begin{definition}\\
Sei $F \in \Cxk{n},\; F \neq 0$. Dann hei"st $F\/$ {\it homogen vom Grad n\/},
falls in $\Cxk{k}[t]\/$ 
\[  F(tx_0,\ldots,tx_n) = t^n F(x_0,\ldots,x_n) \]
gilt.
\end{definition}
Im folgenden werden homogene Polynome in "Ubereinstimmung mit den Konventionen
in der Literatur immer mit Gro"sbuchstaben bezeichnet.

\begin{satz}\\ 
$ F \in \Cxk{k},\: F \neq 0\/$ ist genau dann homogen vom Grad $n$, falls $F$
folgende  Gestalt hat~:
\[ F = \sum_{i_0+\cdots +i_k=n} a_{i_0\ldots i_k}x_0^{i_0}\cdots
x_k^{i_k} \]
(D.h.~alle Monome sind vom gleichen Grad.)
\end{satz}
\begin{beweis} \cite[4.4.1]{BK}, \cite[I.10.1]{Wa} \end{beweis}


\begin{korollar}\\
Jedes Polynom $f \neq 0\/$ l"a"st sich eindeutig als Summe nicht-verschwindender
homogener Terme darstellen~:
\[f = F_{n_1} + \cdots + F_{n_r} \qquad F_{n_i} \mbox{ homogen vom Grade
}n_i,\; n_1 < \cdots < n_r \]
($F_{n_i}\/$ besteht genau aus den Monomen von $f$, die vom Grad
$n_i\/$ sind ($i=1\ldots r$).)
\end{korollar}
\bew{4.4.2}

\begin{satz}(Euler Formel)\\
Sei $F(x_0,\ldots,x_k)\/$ homogen vom Grad $n$. Dann gilt
\begin{eqnarray}
 \sum_{i=0}^{k} x_i \frac{\partial F}{\partial x_i} & = &nF \\[1.5ex]
  \sum_{i_1,\ldots,i_s} x_{i_1}\cdots x_{i_s} 
          \frac{\partial^s F}{\partial x_{i_1}\cdots \partial x_{i_s}} & = &
        n(n-1)\cdots (n-s+1)F 
\end{eqnarray}
\end{satz}
\bew{4.4.3, 4.4.4}

\begin{lemma}\\
Jeder Faktor eines homogenen Polynoms ist homogen.
\end{lemma}
\bew{4.4.5}

\pagebreak
\begin{definition}\\
Sei $F \in \Cxk{r}\/$ ein homogenes Polynom vom Grad $n$, $x_0 \nmid F$. Dann
hei"st das (ev.~nicht-homogene Polynom) $f \in \C[x_1,\ldots,x_r] $
\[f(x_1,\ldots,x_r) = F(1,x_1,\ldots,x_r)\]
{\it assoziiert\/} zu $F$.
\end{definition}

\begin{korollar}\\
$F\/$ ist genau dann irreduzibel, wenn das zu $F\/$ assoziierte Polynom irreduzibel ist.
\end{korollar}

\begin{bemerkung}
\begin{enumgjlett}
  \item Der Begriff `assoziiert' wird im folgenden immer im Sinne der obigen
Definition verwendet. Er darf nicht mit seiner Verwendung im Zusammenhang mit
Faktorisierung verwechselt werden.  

  \item Der "Ubergang von $F\/$ zu $f\/$ beschreibt den "Ubergang von der
projektiven zur affinen Hyperfl"ache. Ist $F\/$ vom Grad $n\/$ und weist $F$
keinen Faktor $x_0\/$ auf, so erh"alt man umgekehrt durch {\it
Homogenisierung\/}

\[ F(x_0,x_1,\ldots,x_r) = x_0^n f(\frac{x_1}{x_0},\ldots,\frac{x_r}{x_0})\]
wieder das urspr"ungliche Polynom.
  \item Assoziierung resp.~Homogenisierung kann nat"urlich bez"uglich jeder
Koordinatenumgebung $U_i\/$ erfolgen (vgl.~\ref{Homogenisierung}).
  \item Im folgenden bezeichnen Gro"sbuchstaben $F,\: G \ldots\/$ immer homogene
Polynome, und die entsprechenden Kleinbuchstaben $f,\: g \ldots\/$ die
assoziierten affinen Polynome.
\end{enumgjlett}
\end{bemerkung}

\begin{satz}\\
Es sei $f \neq 0\/$ ein Polynom mit der bis auf Reihenfolge und Multiplikation
mit Konstanten eindeutigen Zerlegung in irreduzible Faktoren $f = f_1\cdots
f_r$. Ferner sei $F\/$ das zu $f\/$ assoziierte homogene Polynom, und $F_i\/$ das zu
$f_i\/$ assoziierte homogene Polynom $(i=1\ldots r)$. Dann ist $F = F_1\cdots
F_r\/$ die bis auf Reihenfolge und Multiplikation mit Konstanten eindeutige
Zerlegung von $F\/$ in homogene Faktoren.
\end{satz}
\bew{4.4.6}

\begin{satz}\\
Sei $F \in \C[x_0,x_1],\: F \neq 0\/$ ein homogenes Polynom vom Grad $n$. Dann
existieren $n\/$ Paare $(a_i,b_i) \in \C^2,\: i=1\ldots n$, mit $(a_i,b_i) \neq
(0,0)$, soda"s
\[ F(x_0,x_1) = a \prod_{i=1}^n (b_ix_0-a_ix_0) \qquad a \in \C \backslash
\{0\} \] 
wobei die Paare $a_i, b_i\/$ bis auf Reihenfolge und Multiplikation mit einem
gemeinsamen Faktor $k_i \in \C \backslash \{0\}\/$ eindeutig bestimmt sind
$(i=1\ldots n)$.
\end{satz}
\bew{4.4.7}


\subsection{Resultante}
\begin{definition}
\mylabel{resdef}\\
Seien $f\/$ und $g\/$ zwei Polynome aus $\Cx$~:
\[ \begin{array}{l@{\;=\;}*{3}{l@{\:+\:}}l}
  f & a_0x^m & a_1x^{m-1} & \cdots & a_m\\[1ex]
  g & b_0x^n & b_1x^{n-1} & \cdots & b_n
   \end{array} 
\qquad a_0\neq 0 \;\hbox{ und }\; b_0 \neq 0 \]

Dann hei"st $R_{f,g}\/$ die {\it Resultante\/} von $f\/$ und $g$~:
\[ R_{f,g} := \left|
\begin{array}{*{10}l}
a_0 & a_1 & a_2 &\ldots & a_m &&&& \\
    & a_0 & a_1 & a_2 &\ldots & a_m \\
 &&         a_0 & a_1 & a_2 &\ldots & a_m \\
 &&&              \ddots & \ddots & \ddots &\cdots &\ddots \\
 &&&&                   a_0 & a_1 & a_2 &\ldots & a_m\\
b_0 & b_1 & b_2 &\ldots & b_n &&&& \\
    & b_0 & b_1 & b_2 &\ldots & b_n \\
 &&         b_0 & b_1 & b_2 &\ldots & b_n \\
 &&&              \ddots & \ddots & \ddots &\cdots &\ddots \\
 &&&&                   b_0 & b_1 & b_2 &\ldots & b_n

\end{array} \right| 
\begin{array}l
  \left. \begin{array}l \\ \\ \\ \\ \\ \end{array} \right\} \quad n \\[7ex]
  \left. \begin{array}l \\ \\ \\ \\ \\ \end{array} \right\} \quad m
\end{array}
 \]
Die Zeilen sind jeweils mit Nullen aufgef"ullt.

\end{definition}

\begin{satz}\\ 
Seien $f\/$ und $g\/$ zwei Polynome aus $\Cx$. Dann haben $f\/$ und $g\/$ genau dann
einen nicht-konstanten gemeinsamen Teiler, wenn die Resultante $R_{f,g}$
verschwindet.
\end{satz}
\bew{4.2.3}

\begin{korollar}\\
Zwei Polynome $f,\:g \in \Cx\/$ haben genau dann eine gemeinsame Nullstelle,
wenn ihre Resultante verschwindet.
\end{korollar}

\pagebreak
\begin{definition}\\
Ist $f \in \Cx\/$ und $f'\/$ die Ableitung von $f\/$ bez"uglich $x$, dann hei"st
$D_f$
\[D_f := R_{f,f'}\] 
die {\it Diskriminante\/} von $f$.
\end{definition}

\begin{satz}\\ 
Ein Polynom $f \in \C[x]\/$ besitzt genau dann einen mehrfachen Faktor, wenn
seine Diskriminante verschwindet.
\end{satz}
\bew{4.2.7}

\begin{definition}\\
Seien $F\/$ und $G\/$ zwei homogene Polynome aus $\C[x_0,x_1]$~:
\[ \begin{array}{l@{\;=\;}*{4}{l@{\:+\:}}l}
    F & a_0x_0^m & a_1x_0^{m-1}x_1 & a_2x_0^{m-2}x_1^2& \cdots & a_mx_1^m\\[1ex]
    G & b_0x_0^n & b_1x_0^{n-1}x_1 & b_2x_0^{n-2}x_1^2& \cdots & b_nx_1^n
   \end{array} \]
Dann ist die Resultante $R_{F,G}\/$ analog zu Polynomen in einer Variablen
definiert~:
\[ R_{F,G} := \left|
\begin{array}{*{6}l}
a_0  &\ldots & a_m && \\
     &\ddots  &\cdots &\ddots \\
     &        & a_0 &\ldots & a_m\\
b_0 &\ldots & b_n && \\
    &\ddots &\cdots &\ddots \\
    &       & b_0  &\ldots & b_n
\end{array} \right| 
\begin{array}l
  \left. \begin{array}l \\ \\ \\ \end{array} \right\} \quad n \\[4ex]
  \left. \begin{array}l \\ \\ \\  \end{array} \right\} \quad m
\end{array}
 \]

\end{definition}

\begin{satz}\\
Seien $F\/$ und $G\/$ zwei homogene Polynome aus $\C[x_0,x_1]$. Dann haben
$F\/$ und $G\/$ genau dann einen nicht-konstanten Faktor, falls ihre
Resultante verschwindet (keine Restriktionen bez"uglich der Koeffizienten wie
in Def.~\ref{resdef}).
\end{satz}
\begin{beweis} \cite[I.10.7]{Wa} \end{beweis}

\begin{satz}\\
Seien $F\/$ und $G\/$ zwei homogene Polynome aus $\Cxk{{k-1}}[x_k]$.
\[ \begin{array}{l@{\;=\;}*{4}{l@{\:+\:}}l}
     F & A_0x_k^m & A_1x_k^{m-1} & A_2x_k^{m-2}& \cdots & A_m\\[1ex]
     G & B_0x_k^n & B_1x_k^{n-1} & B_2x_k^{n-2}& \cdots & B_n
   \end{array} \qquad \hbox{mit } \;A_0 \neq 0,\: B_0 \neq 0
 \]
wobei $A_i,\:B_j \in \Cxk{{k-1}}\/$ homogene Polynome vom Grad $i\/$ resp.~$j$
sind.  Dann ist $R_{F,G} \in \Cxk{{k-1}}\/$ die Resultante von $F\/$ und $G$
bez"uglich $x_k$, und es gilt~: \[R_{F,G} = 0 \qquad \hbox{oder} \qquad
R_{F,G} \hbox{ ist homogen vom Grad } mn \:.\]
\end{satz} 
\bew{4.4.8}


\subsection{Projektive R"aume}

\begin{definition}
\begin{enumgjlett}
  \item Der {\it n--dimensionale komplexe projektive Raum\/} $\PC{n}\/$ ist
definiert als Quotient
\[ \PC{n} := \left. \left(\C^{n+1}\; \backslash \; \{(0,\ldots,0)\}\right)
\right/ _{\textstyle \sim} \]
mit der "Aquivalenzrelation $\;\sim\;\/$ welche folgenderma"sen definiert ist~:
\[ \begin{array}{l}
(x_0',\ldots,x_n') \sim (x_0,\ldots,x_n) \quad \Longleftrightarrow \\[0.5ex]
 (\exists  \lambda \in \C \:\backslash\: \{0\}) \quad 
   (x_0',\ldots,x_n') = (\lambda x_0,\ldots,\lambda x_n)
 \end{array} \]

  \item Man nennt die $(n+1)$--Tupel von komplexen Zahlen $(x_0,\ldots,x_n)$
{\it homogene Koordinaten\/} des Punktes $(x_0,\ldots,x_n)$.

  \item Die {\it komplexe projektive lineare Gruppe\/} $\PGL{n+1}\/$ ist die
Gruppe 
\[\PGL{n+1} := \left.\GL{n+1} \right/ \{\lambda\cdot\id\} \]
Sie operiert auf $\PC{n}\/$ durch lineare regul"are Transformationen
\[x' = Ax \;.\]
Fa"st man die Transformation $x' = Ax\/$ als Basiswechsel auf, so wird jedes auf
diese Weise definierte Koordinatensystem auch {\it homogenes
Koordinatensystem\/} genannt.      

  \item Ein {\it projektiver linearer Teilraum\/} von $\PC{n}\/$ ist eine
Teilmenge von $\PC{n}$, welche durch ein System von linearen homogenen
Gleichungen gegeben ist~:
\[ a_{i, 0}x_0 + \cdots +  a_{i, n}x_n = 0 \qquad i=1\ldots m \]
Hat das System Rang $n-k$, so k"onnen offensichtlich homogene Koordinaten $y_0
\ldots y_n\/$ eingef"uhrt werden, soda"s der projektive Teilraum gegeben ist
durch
\[ y_{k+1} = \ldots = y_n = 0 \:.\]
Man hat dadurch eine nat"urliche Bijektion zwischen diesem projektiven
linearen Teilraum $P\/$ und $\PC{k}$, und $P\/$ ist somit ein {\it
k--dimensionaler projektiver Teilraum\/}. Die $(n-1)$--dimensionalen
Teilr"aume werden {\it Hyperebenen\/} genannt. Die Hyperebenen von $\PC{2}$
sind Geraden. Die Hyperebene $x_0=0\/$ wird oft als {\it Hyperebene (Gerade) im
Unendlichen\/} bezeichnet.

  \item Man definiert die {\it Koordinaten-Nachbarschaften\/} $U_i \subset
\PC{n}\/$  als Komplemente der Hyperebenen $x_i = 0$~:
\[ U_i := \{(x_0,\ldots,x_n) \in \PC{n} \;\mid\; x_i \neq 0 \} \]
F"ur alle $i = 0\ldots n\/$  definiert man eine stetige, bijektive Abbildung
\[ \Phi_i \; : \quad U_i \rightarrow \C^n \]
\[ \Phi_i(x_0,\ldots,x_n) =
(\frac{x_0}{x_i},\ldots,\frac{\hat{x}_i}{x_i},\ldots,\frac{x_n}{x_i}) \:.\]
Die inverse Abbildung ist~:
\[ \Phi_i^{-1}(x_1,\ldots,x_n) = (x_1,\ldots,x_i,1,x_{i+1},\ldots,x_n) \:. \]
\end{enumgjlett}
\end{definition}

\section{Ebene algebraische Kurven}

\begin{definition}\\
 Die {\it Nullstellenmenge\/} $V(f)\/$ eines Polynoms $f \in
\C[x_1,\ldots,x_k]\/$ ist eine Teilmenge des affinen Raumes $\C^k$~:
\[ V(f) := \{(c_1,\ldots,c_k) \in \C^k \:\mid\; f(c_1,\ldots,c_k)=0\} \]
Eine solche Nullstellenmenge wird als {\it affine algebraische
Hyperfl"ache\/} bezeichnet. Im Falle von $k = 2\/$ ist $V(f)\/$ eine {\it affine
algebraische Kurve\/}. 
Betrachtet man gemeinsame Nullstellen endlich vieler Funktionen
$f_1,\ldots,f_r$, dann wird $V(f_1,\ldots,f_r)\/$ {\it affine algebraische
Menge\/} genannt. 
\end{definition}

\begin{definition}\\
Ist $F(x_0,\ldots,x_n)\/$ ein nicht-konstantes homogenes Polynom, so bezeichnet
die Gleichung $F(x_0,\ldots,x_k) = 0\/$ eine {\it projektive algebraische
Hyperfl"ache\/} $V(F)\/$ in $\PC{k}$~:
\[ V(F) := \{(x_0,\ldots,x_k) \in \PC{k} \:\mid\; F(x_0,\ldots,x_k)=0\} \]
Der Teil von $V(F)$, welcher im affinen Raum $U_0 \subset \PC{k}\/$ liegt,
n"amlich $V(F) \cap U_0$,
\[ V(F) \cap U_0 = \{(1,x_1,\ldots,x_k) \in \PC{k} \:\mid\;
F(1,x_1,\ldots,x_k)=0\}\]
 ist offensichtlich gerade die Nullstellenmenge des Polynoms 
\[ f(x_1,\ldots,x_k) = F(1,x_1,\ldots,x_k) \]
wenn man $\C^k\/$ mit $U_0\/$ identifiziert~:
\[V(F) \cap U_0 = V(f)\]
\end{definition}

\begin{definition}\\
Eine {\it ebene komplexe projektiv-algebraische Kurve\/} ist die
Nullstellenmenge eines nicht-konstanten homogenen Polynoms in der
komplexen projektiven Ebene $\PC{2}$.
\end{definition}

Bemerkung~: man bezeichnet die Kurven als `eben', weil sie in der Ebene
eingebettet sind, als `algebraisch', weil sie als Nullstellenmenge eines
Polynoms eine algebraische Beschreibung besitzen, und als `projektiv', weil
die Nullstellen des Polynoms in der projektiven Ebene liegen.

Im weiteren wird der Begriff  mit `Kurve' oder `ebene Kurve' abgek"urzt.

\bigskip
\begin{definition}\\
Eine ebene Kurve ist {\it irreduzibel\/}, falls sie nicht die Vereinigung
zweier verschiedener ebener Kurven ist. 
\end{definition}

\begin{satz}\\
Ist $C\/$ eine ebene algebraische Kurve und $F\/$ ein homogenes Polynom mit $V(F)
= C$, so ist $C\/$ genau dann irreduzibel, wenn $F\/$ Potenz eines irreduziblen
Polynoms ist.
\end{satz}
\bew{5.1.1}

\begin{satz}\\
Sei $C\/$ eine ebene algebraische Kurve, die Nullstellenmenge eines homogenen
Polynoms $F\/$ mit Primfaktoren $F_1,\ldots,F_r$, d.h.
\[F = F_1^{k_1}\cdots F_r^{k_r}\]
dann gilt~:
\begin{enumgjpar}
  \item $C\/$ besitzt eine eindeutige Zerlegung in irreduzible Kurven,
\[ C = C_1 \cup \ldots \cup C_r \]
  \item Mit geeigneter Nummerierung sind die irreduziblen Kurven $C_i\/$ die
Nullstellenmengen der $F_i$. Die Polynome $F_i\/$ sind bis auf einen gemeinsamen
Faktor durch die $C_i\/$ und somit durch $C\/$ bestimmt.
\end{enumgjpar}
\end{satz}
\bew{5.1.2}

\begin{definition}\\
Die irreduziblen Kurven, welche in der Zerlegung einer ebenen Kurve $C$
auftauchen, hei"sen {\it irreduzible Komponenten\/} von $C$.
\end{definition}

Der vorangegangene Satz erlaubt eine bis auf einen konstanten Faktor
eindeutige Zuordnung eines homogenen Polynoms zu jeder ebenen Kurve $C$~: ist
$C\/$ irreduzibel, so ist $C\/$ die Nullstellenmenge eines eindeutig bestimmten
irreduziblen Polynoms. Besteht $C\/$ aus mehreren irreduziblen Komponenten, $C =
C_1 \cup \cdots \cup C_r$, dann ist jedes $C_i\/$ assoziiert mit einem
eindeutigen irreduziblen Polynom $F_i$, und man assoziiert $C\/$ mit dem Polynom
$F_1\cdots F_r$.

\bigskip
\begin{definition}\\
Ist $F\/$ das (bis auf einen konstanten Faktor) durch eine Kurve $C\/$ eindeutig
bestimmte homogene Polynom (im obigen Sinne), dann nennt man
\[F(x_0,x_1,x_2) = 0\]
die {\it Gleichung\/} von $C$.
\end{definition}

\begin{definition}\\
Die {\it Ordnung\/} einer ebenen Kurve $C\/$ ist der Grad des mit $C$
assoziierten Polynoms. Man verwendet oft {\it Grad\/} an Stelle von Ordnung.
\end{definition}

\begin{definition}\\ 
Die ebenen Kurven der Ordnung 1, 2, 3, 4, 5, 6 $\ldots\/$ hei"sen Gerade,
Quadrik, Kubik, Quartik, Quintik, Sextik $\ldots\/$ .
\end{definition}

\begin{definition}\\ Die Punkte $P_0 = (1,0,0),\: P_1 = (0,1,0)\/$ und $P_2 =
(0,0,1)\/$ werden oft als {\it Fundamentalpunkte\/} von $\PC{2}\/$ bezeichnet.
Dual dazu nennt man die verbindenden Geraden $L_0 :\: x_0=0,\; L_1 :\:
x_1=0,\; L_2 :\: x_2 = 0\/$ die {\it Fundamentalgeraden\/}. Die Vereinigung
dieser Geraden wird auch {\it Fundamentaldreieck\/} genannt.
\end{definition}



% Master File: algcurve.tex

\section{Grundlagen von \name}

\subsection{Datenstrukturen}

\subsubsection{Homogene und Affine Koordinaten}
\label{homaffcoord}

Als Datenstruktur f"ur homogene und affine Koordinaten wird der Typ {\tt list}
verwendet. Die Definition eines Punktes aus $\PC{2}\/$ erfolgt somit identisch
zur Definition einer dreielementigen Liste. Zum Beispiel kann $v = (3,2+4i,a)
\in \PC{2}\/$ ($a\/$ eine Unbestimmte aus $\C$) auf die folgende Weise
eingegeben werden~:
\begin{quote}
  \tt > v := [3, 2 + 4*I, a];
\end{quote}
Es ergeben sich daraus folgende Konsequenzen~:
\begin{itemize}

  \item Homogene und affine Koordinaten werden gleich behandelt. Dies hat
allerdings zur Folge, da"s im projektiven Fall die Indizierung mittels {\tt
v[i]} von $1\ldots n+1\/$ anstelle von $0\ldots n\/$ erfolgt, und f"ur die
Dimension erh"alt man entsprechend $n+1\/$ anstelle von $n\/$ (mittels {\tt
nops(v)} oder {\tt linalg[vectdim](v)}).
 
  \item S"amtliche Vektorfunktionen (z.T.~auch Matrixfunktionen) aus dem
\maple-Paket f"ur lineare Algebra ({\tt linalg}) sind anwendbar, darunter~:
\begin{itemize}
  \item {\tt scalarmul}~: Multiplikation mit Skalaren.
  \item {\tt crossprod}~: Kreuzprodukt.
  \item {\tt dotprod, innerprod}~: Skalarprodukt.
  \item {\tt grad}~: Vektorgradient.
\end{itemize}
Es mu"s allerdings ber"ucksichtigt werden, da"s bei Funktionen aus {\tt
linalg} der Resultattyp gegebenenfalls ein Vektor (Typ {\tt vector}) und keine
Liste ist (Bsp. {\tt crossprod}).  
   
   \item Die Dimension wird bei der Eingabe nicht auf $n=2\/$ beschr"ankt
(vgl.~Konzept).  \item Die Eingabe der Null-Koordinaten {\tt [0,0,0]} ist
m"oglich. Dies ist auch notwendig, da f"ur affine Koordinaten derselbe
Datentyp verwendet wird.  Die "Uberpr"ufung der Dimension sowie im homogenen
Fall der Test auf Null-Ko\-or\-di\-naten erfolgen durch die Prozeduren.
  
  \item Ein Listenelement kann nicht direkt ver"andert werden~: die
Anweisung {\tt v[2]:= a} f"uhrt zur impliziten Definition einer {\tt table}
namens {\tt v} und der Listeninhalt geht verloren. Korrekt ist die Anweisung
{\tt subsop( 2=a, v )}.
\end{itemize}


\subsubsection{Ebene algebraische Kurven} 

Ebene algebraische Kurven werden als Polynome, deren Nullstellenmenge sie
sind, eingegeben. Diese Polynome (vgl.~Einleitung) sind jedoch nicht
eindeutig, so bestimmen z.B.~die Polynome $ax_0 + bx_1 + cx_2\/$ und $(ax_0 +
bx_1 + cx_2)^2\/$ dieselbe Gerade. Fast alle implementierten Funktionen
akzeptieren Polynome mit Mehrfachfaktoren. Die Polynome werden jedoch nicht
auf die {\it Gleichung\/} der Kurve reduziert.  Kurven mit Mehrfachkomponenten
werden wie Kurven mit der entsprechenden Anzahl verschiedener Komponenten
behandelt.  Die genannte Doppelgerade zum Beispiel wird als Vereinigung
zweier verschiedener Geraden angesehen.

\subsubsection{Variablen} 

In der Literatur sind f"ur Variablen in $\PC{n}\/$ die Bezeichnungen
$x_0,\ldots,x_n\/$ und f"ur affine Variablen $x_1 ,\ldots,x_n\/$ (in $\C^2 : \;
x,\:y$) "ublich. Als Parametervariable in rationalen Funktionen wird oft $t$
verwendet.  Diese Bezeichnungen werden in \name\ als {\tt x0,x1, $\ldots$,xn}
resp.~{\tt x,y} und {\tt t} als Defaultwerte verwendet~:
\begin{quote}
  \begin{verbatim}
algcurve[homvars] := [x0,x1,x2]:
algcurve[affvars] := [x,y]:
algcurve[explvar] := t:    
  \end{verbatim}
\end{quote}
Nach Ausf"uhrung von {\tt with(algcurve)} kann auf die Standardbezeichner
direkt mit {\tt homvars}, {\tt affvars} und {\tt explvar} zugegriffen werden~:
\begin{quote}
  \begin{verbatim}
> homvars;
                                  [x0, x1, x2]    
  \end{verbatim}
\end{quote}




\subsubsection{{\tt getindets} }

\begin{kopf}{getindets(arg)}
\pitem{arg} Beliebiges Argument.
\end{kopf}

\begin{zweck}
Es wird festgestellt, ob in {\tt arg} Standardbezeichner aus einer der Listen
{\tt homvars} und {\tt affvars} vorkommen. Ist dies nicht der Fall, oder
kommen Namen aus beiden Listen vor, erscheint eine Fehlermeldung. Sonst ist
das Resultat {\tt homvars}, falls ein Name aus {\tt homvars} in {\tt arg}
vorkommt, und {\tt affvars}, falls ein Name aus {\tt affvars} in {\tt arg}
vorkommt.
\end{zweck}

\pagebreak

\begin{code}
\begin{verbatim}
# ___  GETINDETS  ________________________________________________________

getindets := proc (fromargs)
local inds;
  inds:= indets(fromargs,name);
  if inds intersect {op(affvars)} <> {} then
    if inds intersect {op(homvars)} <> {} then
      ERROR(`homogeneous and affine variables in same expression`)
    fi;
    affvars
  elif inds intersect {op(homvars)} <> {} then
    homvars
  else
    ERROR(`neither homogeneous nor affine variables in expression`)  
  fi
end:
\end{verbatim}
\end{code}


\subsection{Neue Typen}


\subsubsection{{\tt type/tpoly}}
\begin{kopf}{type/tpoly(p,vars)}
  \pitem{p} Beliebiges Argument.
  \pitem{vars} Liste von Namen \opt.
\end{kopf}
\begin{zweck}
Es wird getestet, ob {\tt p} ein Polynom oder eine Liste von Polynomen in den
Variablen {\tt vars} ist. Resultat ist eine Boolesche Konstante.
Default f"ur {\tt vars} ist {\tt indets(p,name)}.
\end{zweck}
\begin{code}
\begin{verbatim}
# ___  TPOLY  ________________________________________________________

`type/tpoly` := proc(p)
local vars;
  if type([args],[anything,list(name)]) then
    vars:= args[2]
  elif type([args],[anything]) then
    vars:= indets(p,name)
  else  
    ERROR(`wrong type or number of arguments`)
  fi;  
  type(p, { polynom(algebraic,vars), list(polynom(algebraic,vars)) } )
end:    
\end{verbatim}
\end{code}


\subsubsection{{\tt type/projpoly} }

\begin{kopf}{type/projpoly(F,vars,deg)}
\pitem {F} Beliebiges Argument.
\pitem {vars} Liste von Namen \opt.
\pitem {deg} Polynom-Grad \opt.
\end{kopf}

\begin{zweck}
Es wird getestet, ob {\tt F} ein homogenes Polynom vom Grad {\tt deg} in den
Variablen {\tt vars} ist. Fehlt {\tt deg}, so kann der Grad beliebig sein.
Default f"ur {\tt vars} ist {\tt homvars}. Resultat ist eine Boolesche
Konstante. Spezialfall~: hat {\tt F} den Grad 0 in {\tt vars}, so ist das
Resultat {\tt false}.
\end{zweck}

\begin{code}
\begin{verbatim}
# ___  PROJPOLY  ________________________________________________________
  ...
  lF:= expand(F);  
  if type(lF,`+`) then lF:= [op(lF)] else lF:= [lF] fi;
  if deg=0 then 
    deg:= degree(lF[1],vars); 
    i0:= 2 
  else
    i0:= 1  
  fi;
  if deg = 0 then RETURN(false) fi;
  for i from i0 to nops(lF) do
    if degree(lF[i],vars) <> deg then
      RETURN (false)
    fi
  od;
  RETURN (true)  
\end{verbatim}
\end{code}

\subsubsection{{\tt type/projcoord} }

\begin{kopf}{type/projcoord(p,dim)}
\pitem {p} Beliebiges Argument. 
\pitem {dim} Dimension \opt.
\end{kopf}

\begin{zweck}
Es wird getestet, ob {\tt p} eine homogene Koordinate aus
$\PC{{\mbox{\tt\scriptsize dim}+1}}\/$ ist. Fehlt {\tt dim}, so ist die
Dimension beliebig. Resultat ist eine Boolesche Konstante.
\end{zweck}
\begin{code}
\begin{verbatim}
# ___  PROJCOORD  ______________________________________________________
  ...
  if nops(p)-1 <> dim then RETURN(false) fi;
  type(p,list) and (not iszerolist(p))
\end{verbatim}
\end{code}



\subsection{Homogenisierung und Projektion}
\label{Homogenisierung}

$\PC{n}\/$ wird von den $n+1\/$ Koordinatenumgebungen $U_0,\ldots,U_n\/$
"uberdeckt.  {\it Affine Koordinaten\/} auf $U_i\/$ erh"alt man mittels

\[ (x_0,\ldots,x_n) \mapsto 
(\frac{x_0}{x_i},\ldots,\frac{\hat{x}_i}{x_i},\ldots,\frac{x_n}{x_i})\]
und aus den affinen Koordinaten erh"alt man  die projektiven Koordinaten durch
\[ (x_1,\ldots,x_n) \mapsto (x_1,\ldots,x_i,1,x_{i+1},\ldots,x_n) \;. \]

\medskip
Aus einem homogenen Polynom $F\/$ vom Grad $n\/$ erh"alt man das (bez"uglich
$U_i$) assoziierte Polynom $f\/$ durch
% \[ f(x_1,\ldots,x_k) = F(1,x_1,\ldots,x_k) \]
\[ f(x_1,\ldots,x_n) = F(x_1,\ldots,x_i,1,x_{i+1},\ldots,x_n) \]
und mit
\[ F(x_0,x_1,\ldots,x_n) = x_i^n
f(\frac{x_0}{x_i},\ldots,\frac{x_{i-1}}{x_i},\frac{x_{i+1}}{x_i},\ldots,
\frac{x_n}{x_i})\] 
wieder das homogene Polynom.


\subsubsection{{\tt hompoly}}

\begin{kopf}{hompoly(f,avars,hvars,nr)}
  \pitem{f} Einzelnes Polynom oder Liste von Polynomen.
  \pitem{avars} Polynomvariablen von {\tt f} \opt.
  \pitem{hvars} Homogene Polynomvariablen \opt.
  \pitem{nr} Nummer der Koordinatenumgebung \opt.
\end{kopf}

\begin{zweck}
Homogenisiert {\tt f} gem"a"s dem oben bestimmten "Ubergang. {\tt hvars}
mu"s ein Element mehr enthalten als {\tt avars}. {\tt nr} ist eine ganze
Zahl zwischen 0 und der Anzahl Elemente von {\tt avars}, Default ist 0.
Default f"ur {\tt avars} ist {\tt affvars} und f"ur {\tt hvars}
{\tt homvars}. Resultat ist ein expandiertes Polynom.
\end{zweck}

\pagebreak

\begin{code}
\begin{verbatim}
# ___  HOMPOLY  ________________________________________________________

    hompoly0 := proc(f,avars,homvar,sublist)
    local lf,deg;
      lf:= expand(f);
      deg:= degree(lf,avars);
      if deg = 0 then deg:= 1 fi;
      expand ( homvar^deg * subs(sublist,lf) )
    end:

  ...
  sublist := [seq(avars[j]=hvars[j]/hvars[nr+1],j=1..nr),
    seq(avars[j]=hvars[j+1]/hvars[nr+1],j=nr+1..nops(avars))];
  avars:= convert(avars,set);  
  if type(f,list) then
    map(hompoly0,f,avars,hvars[nr+1],sublist)
  else
    hompoly0(f,avars,hvars[nr+1],sublist)    
  fi    
\end{verbatim}
\end{code}

\subsubsection{{\tt hompoint}}

\begin{kopf}{hompoint(p,nr)}
  \pitem{p} Einzelner Punkt oder Liste von Punkten.
  \pitem{nr} Nummer der Koordinatenumgebung \opt.
\end{kopf}

\begin{zweck}
Homogenisiert {\tt p} gem"a"s dem "Ubergang in \ref{Homogenisierung}. {\tt nr}
ist eine ganze Zahl zwischen 0 und der Dimension von {\tt p} (resp.~eines
Elementes aus {\tt p}), Default ist 0.
\end{zweck}
\begin{code}
\begin{verbatim}
# ___  HOMPOINT  ______________________________________________________

    hompoint0 := proc(p,nr,dim)
      [p[1..nr],1,p[nr+1..dim]]
    end:

  ...
  dim:= nops(p);
  if nr > dim then ERROR(`wrong projection number`) fi; 
  hompoint0(p,nr,dim)  
\end{verbatim}
\end{code}

\subsubsection{{\tt affpoly}}

\begin{kopf}{affpoly(F,hvars,avars,nr)}
  \pitem{F} Einzelnes Polynom oder Liste  von Polynomen.
  \pitem{hvars} Polynomvariablen von {\tt F} \opt.
  \pitem{avars} Affine Polynomvariablen \opt.
  \pitem{nr} Nummer der Koordinatenumgebung \opt.
\end{kopf}

\begin{zweck}
Projiziert {\tt F} gem"a"s dem "Ubergang in \ref{Homogenisierung} in die affine
Koordinatenumgebung $U_{\hbox{\tt\small nr}}$. {\tt hvars}
mu"s ein Element mehr enthalten als {\tt avars}. {\tt nr} ist eine ganze
Zahl zwischen 0 und der Anzahl Elemente von {\tt avars}, Default ist 0. Default
f"ur {\tt hvars} ist {\tt homvars} und f"ur {\tt avars} {\tt affvars}.
\end{zweck}  
\begin{code}
\begin{verbatim}
# ___  AFFPOLY  ______________________________________________________
  
  sublist := [seq(hvars[j]=avars[j],j=1..nr),hvars[nr+1]=1,
    seq(hvars[j]=avars[j-1],j=nr+2..nops(hvars))];
  subs(sublist,F)    
\end{verbatim}
\end{code}

\subsubsection{{\tt affpoint}}

\begin{kopf}{affpoint(p,nr)}
  \pitem{p} Einzelner Punkt oder Liste von Punkten.
  \pitem{nr} Nummer der Koordinatenumgebung \opt.
\end{kopf}

\begin{zweck}
Projiziert {\tt p} gem"a"s dem "Ubergang in \ref{Homogenisierung} in die affine
Koordinatenumgebung $U_{\hbox{\tt\small nr}}$. {\tt nr} ist eine ganze Zahl
zwischen 0 und der Punkt-Dimension aus {\tt p}, Default ist 0.
\end{zweck}
\begin{code}
\begin{verbatim}
# ___  AFFPOINT  ______________________________________________________

    affpoint0 := proc(p,nr,dim)
      if p[nr+1] = 0 then RETURN(NULL) fi;
      scalarmul([p[1..nr],p[nr+2..dim]],1/p[nr+1])
    end:

  ...
  dim:= nops(p);
  if nr > dim-1 then ERROR(`wrong projection number`) fi; 
  affpoint0(p,nr,dim)  
\end{verbatim}
\end{code}


\subsection{Koeffizientenextraktion} 
\label{coeffextract}
Die Anzahl Koeffizienten eines homogenen Polynoms $F\/$ vom Grad $n\/$ "uber 3
Variablen ist
\[\frac{(n+1)(n+2)}{2}\]
Da $F\/$ und $\lambda F\/$ die gleiche ebene Kurve bestimmen, k"onnen die
Koeffiziententupel als Elemente des projektiven Raumes $\PC{N}\/$ mit
\[ N = \frac{(n+1)(n+2)}{2} -1 = \frac{n(n+3)}{2} \]
 aufgefa"st werden.  Da dies f"ur lineare Systeme von Kurven von Bedeutung
ist, werden Prozeduren zum Wechsel zwischen der Polynom-- und der
Tupeldarstellung zur Verf"ugung gestellt.

\subsubsection{{\tt poly2coord}}
\begin{kopf}{poly2coord(F,vars)}
  \pitem{F} Homogenes Polynom.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Die Koeffizienten des homogenen Polynoms {\tt F} vom Grad $n\/$ werden als
$\left(\frac{(n+1)(n+2)}{2}\right)$--Tupel  dargestellt. {\tt
vars} mu"s drei Variablenbezeichner enthalten, Default ist {\tt
homvars}.
\end{zweck}

\begin{algo}
Die Koeffizientenreihenfolge richtet sich nach der Reihenfolge der 3 Variablen
in {\tt vars}~: Koeffizienten von Monomen mit h"oherem Grad in der
1.~Variablen kommen vor solchen mit niedrigerem Grad in der 1.~Variablen.
Innerhalb einer Gruppe von Monomen mit gleichem Grad in der 1.~Variablen
kommen Koeffizienten von Monomen mit h"oherem Grad in der 2.~Variablen vor
solchen mit niedrigerem Grad in der 2.~Variablen, etc.
Es ist dieselbe Reihenfolge wie sie von {\tt sort} verwendet wird, wenn als
optionaler Parameter die Liste der Variablen angegeben wird~:
\begin{quote}
  \begin{verbatim}
> conic := a*x^2 + b*y^2 + c*z^2 + d*x*y + e*x*z + f*y*z:
> sort(conic,[x,y,z]);
                      2                      2              2
                   a x  + d x y + e x z + b y  + f y z + c z

> poly2coord(conic,[x,y,z]);
                              [ a, d, e, b, f, c ]
  \end{verbatim}
\end{quote}
Ist wie im Beispiel die Reihenfolge der Variablen $[x,y,z]$, so erh"alt man
den Index des Koeffizienten von $x^i y^j z^{n-i-j}\/$  ($i+j \le n$) mittels der
Funktion 
\[ (i,j) \mapsto \frac{(n-i)(n-i+1)}{2} + (n-i-j) + 1 \;. \]

Zuerst wird ein Null-Vektor ({\tt array}) der Dimension $N=
\left(\frac{(n+1)(n+2)}{2}\right)\/$ erzeugt. Das Polynom wird monomweise
abgearbeitet. F"ur jedes Monom werden die Exponenten der ersten beiden
Variablen bestimmt. Daraus wird mit der obigen Funktion der Index abgeleitet.
Der zugeh"origen Vektorkoordinate wird der Koeffizient des Monoms zugewiesen.
\end{algo}
\begin{code}
\begin{verbatim}
# ___  POLY2COORD  ______________________________________________________

  n:= degree(lF,varset);
  v:= array([seq(0,i=1..(n+1)*(n+2)/2)]);
  if type(lF,`+`) then lF:= [op(lF)] else lF:= [lF] fi;
  for m from 1 to nops(lF) do
    i:= degree(lF[m],vars[1]);
    j:= degree(lF[m],vars[2]);
    v[(n-i)*(n-i+1)/2 + 1 + n-i-j] := coeffs(lF[m],varset)
  od;  
  convert(v,list)  
\end{verbatim}
\end{code}


\subsubsection{{\tt coord2poly}}
\begin{kopf}{coord2poly(c,vars)}
  \pitem{c} Koeffiziententupel.
  \pitem{vars} Homogene Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Erstellt aus dem Koeffiziententupel {\tt c} das entsprechende homogene Polynom
in den Variablen {\tt vars}. Der Grad $n\/$ des Polynoms ist durch die Dimension
$k\/$ des Tupels {\tt c} gegeben, das hei"st, 
\[ k = \frac{(n+1)(n+2)}{2} \qquad n \in \N \]
Hat $k\/$ nicht diese Form, so erscheint eine Fehlermeldung.
{\tt vars} mu"s drei Elemente enthalten, Default ist {\tt homvars}. 
{\tt coord2\-poly} ist die Umkehrfunktion von {\tt poly2coord} und
ber"ucksichtigt demnach die gleiche Koeffizientenreihenfolge.
\end{zweck}
\begin{code}
\begin{verbatim}
# ___  COORD2POLY  ______________________________________________________

  n:= -3/2 + sqrt(1+8*nops(C))/2; 
  vind:= 0;
  F:= 0;
  for i from n by -1 to 0 do
    for j from n-i by -1 to 0 do
      vind:= vind+1;
      F:= F + C[vind]*vars[1]^i*vars[2]^j*vars[3]^(n-i-j)
    od
  od; 
\end{verbatim}
\end{code}

\subsection{Standardisierung und "Aquivalenz}
In $\PC{n}\/$ gilt f"ur homogene Koordinaten respektive Polynome~:
\[(x_0,\ldots,x_n) \sim (\lambda x_0,\ldots,\lambda x_n)\] 
\[ F \sim \lambda F \]

f"ur beliebige $\lambda \in \C \backslash \{0\}$. In \name\ soll nach Bedarf
eine m"oglichst einfache, sprich gut lesbare Darstellung hergestellt werden
k"onnen, d.h.~es wird ein geeigneter Faktor $\lambda\/$ gesucht. Diese
Vereinfachungen sind in \maple\ von zentraler Bedeutung. H"aufig kann nur
weitergerechnet werden, wenn die Eingabe in der nachfolgend beschriebenen
Weise vereinfacht wird. Unn"otig lange Ausdr"ucke k"onnen zu erheblich
l"angeren Rechenzeiten f"uhren. Durch Vereinfachungen wird die Menge der
zul"a"sigen Eingaben, f"ur die eine Berechnung effektiv durchgef"uhrt
werden kann, ausgeweitet.

\subsubsection{{\tt standard} }
\begin{kopf}{standard(p,vars)}
  \pitem{p} Homogene Koordinate oder Polynom.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Ist {\tt p} ein Polynom, so erfolgt die Standardisierung {\tt p} bez"uglich
des Ko\-ef\-fi\-zienten-Tupels. Das Tupel $(x_0,\ldots,x_n)\/$ wird
folgenderma"sen zu einem "aquivalenten Tupel $(x_0',\ldots,x_n')$
`vereinfacht'~:
\begin{itemize}
  \item Alle $x_i'\/$ sind quotientenfrei.
  \item Das erste von 0 verschiedene $x_i'\/$ ist positiv.
  \item Sind alle $x_i\/$ rational (aus $\Q[x]$), so haben die $x_i'\/$ keinen
gemeinsamen Teiler. 
\end{itemize}
Resultat ist das vereinfachte Tupel, resp.~das Polynom mit vereinfachten
Koeffizienten.
\end{zweck}

\begin{algo}
Zuerst wird das ganze Tupel durch das erste von 0 verschiedene $x_i$
dividiert. Dann wird auf alle $x_i\/$ die Funktion {\tt normal} angewendet.
Dadurch wird erreicht, da"s auch nicht-vereinfachte, nicht-rationale, gemeinsame
Teiler aller $x_i\/$ gek"urzt werden. Dann wird das ganze Tupel mit dem
kleinsten gemeinsamen Vielfachen aller verbleibenden Nenner multipliziert.
\end{algo}
\begin{code}
\begin{verbatim}
# ___  STANDARD  ______________________________________________________

  for j from i+1 to lpdim do lp[j]:= normal (lp[j]/lp[i]*dummy) od;
  lp[i]:= dummy;
  denomlist:= []; exptable:= table();
  intfac:= 1;
  for j from i+1 to lpdim do
    tmp:= op(1,[op(lp[j])]);
    if type(tmp,fraction) then
      tmp:= denom(tmp);  k:= tmp/gcd(intfac,tmp); 
      intfac:= intfac*k;
      denomj:= denom(lp[j])/tmp
    else
      denomj:= denom(lp[j])
    fi;
    if denomj <> 1 then 
      if type(denomj,`*`) then 
        faclist:=[op(denomj)] 
      else 
        faclist:=[denomj] 
      fi;
      for k from 1 to nops(faclist) do
        if type(faclist[k],anything^integer) then
          expo:= op(2,faclist[k]);  fac:= op(1,faclist[k])
        else 
          expo:= 1; fac:= faclist[k]
        fi;     
        if member(fac,denomlist,'ind') then
          if exptable[ind] < expo then exptable[ind]:= expo fi
        else
          denomlist:= [op(denomlist),fac];
          exptable[nops(denomlist)]:= expo
        fi      
      od
    fi
  od;  
  comfac:= convert( [ seq(denomlist[k]^exptable[k],
                      k=1..nops(denomlist))], `*`);
  for k from i to lpdim do lp[k]:= intfac*lp[k]*comfac/dummy od;
\end{verbatim}
\end{code}

\subsubsection{{\tt homequal}}

\begin{kopf}{homequal(p1,p2)}
  \pitem{p1,p2} Zwei homogene Koordinaten.
\end{kopf}

\begin{zweck}
Es wird getestet, ob zwei homogene Koordinaten "aquivalent sind. Das Resultat
ist eine Boolesche Konstante. 
\end{zweck}

\begin{algo}
Im Falle von $\PC{2}\/$ wird getestet, ob das Vektorprodukt der beiden Tupel der
Nullvektor ist, denn es gilt~:
\[ \vec{p}_1 \times \vec{p}_2 = \vec{0}\quad \Leftrightarrow \quad (\exists k
\in \C)\;\:\vec{p}_1\: =\: k\cdot \vec{p}_2 \]
Im allgemeinen Fall wird die Vektorgleichung $\vec{p}_1\: =\: k\cdot
\vec{p}_2\/$ zu einer Menge von Komponentengleichungen transformiert und mit
{\tt solve} nach einer L"osung $k\/$ gesucht. Gibt es keine solche L"osung, so
ist das Resultat von {\tt solve} {\tt NULL}.
\end{algo}
\begin{code}
\begin{verbatim}
# ___  HOMEQUAL  ______________________________________________________

  if nops(p1) = 3 then
    iszerolist(convert(crossprod(p1,p2),list));
  else
    cp := { seq(p1[i] = k*p2[i],i=1..nops(p1)) };
    evalb(solve(cp,k) <> NULL)
  fi  
\end{verbatim}
\end{code}




% Master File: algcurve.tex

\section{Transformationen}

Die Transformationen von Polynomen, speziell Trans\-for\-ma\-tio\-nen aus
$\PGL{n}$, geh"oren zu den elementaren Bed"urfnissen in der projektiven
Geometrie. In \name\ besteht zwischen linearen und nicht-linearen
(z.B.~quadratischen) Transformationen prinzipiell kein Unterschied in Eingabe,
Format und Anwendung. F"ur den linearen Fall wird eine Verbindung zum Typ {\tt
matrix} aus {\tt linalg} hergestellt, wodurch alle Matrixoperationen anwendbar
werden.

\bigskip
F"ur Transformationen wird die Darstellung als `Bild-Koordinate' gew"ahlt. Das
hei"st, wenn $(x_1,\ldots,x_n)\/$ affine Koordinaten sind, so wird die
Lineartransformation
\[ A\cdot \vec{x} + \vec{b} \qquad A \in \GL{n}\:,\; \vec{b} \in \C^n\]
als
\[ (a_{11}x_1+ \cdots + a_{1n}x_n + b_1\:,\: \ldots \:,\: a_{1n}x_1+ \cdots +
a_{nn}x_n + b_n) \]
( $a_{ij},b_k\/$ Komponenten von $A\/$ resp.~$\vec{b}$) dargestellt. Dasselbe
gilt f"ur homogene (dort ist allerdings kein $\vec{b}\/$ zul"a"sig),
quadratische und weitere Transformationen. Im folgenden wird das Bild der
unbestimmten Koordinate $(x_0,\ldots,x_n)\/$ bez"uglich einer Abbildung $A :
\PC{n} \rightarrow \PC{n} \/$ als {\it Bild-Koordinate\/} bez"uglich $A\/$
bezeichnet.


\subsection{Homogenisierung und Projektion}

\subsubsection{{\tt homtrans}}
\begin{kopf}{homtrans(T,avars,hvars,nr)}
  \pitem{T} Transformation (Bild-Koordinate).
  \pitem{avars} Affine Polynomvariablen \opt.
  \pitem{hvars} Homogene Polynomvariablen \opt.
  \pitem{nr} Nummer der Koordinatenumgebung \opt.
\end{kopf}

\begin{zweck}
Homogenisiert die in {\tt T} als Bild-Koordinate angegebene affine
Transformation in $U_{\hbox{\tt nr}}$. Resultat ist die Bild-Koordinate der
entsprechenden Transformation im projektiven Raum. {\tt hvars} mu"s ein
Element mehr enthalten als {\tt avars}. {\tt nr} ist eine ganze Zahl
zwischen 0 und der Anzahl Elemente von {\tt avars}, Default ist 0. Default f"ur
{\tt avars} ist {\tt affvars} und f"ur {\tt hvars} {\tt
homvars}.
\end{zweck}

\begin{algo}
{\tt T} wird mittels {\tt hompoint(T,nr)} zu einer homogenen Koordinate
erg"anzt, und an\-schlie\-"send durch {\tt hompoly(T,avars,hvars,nr)}
homogenisiert.
\end{algo}

\pagebreak
\begin{code}
\begin{verbatim}
# ___  HOMTRANS  ________________________________________________________

  hompoly(hompoint(T,nr),avars,hvars,nr)  
\end{verbatim}
\end{code}


\subsubsection{{\tt afftrans}}
\begin{kopf}{afftrans(T,hvars,avars,nr)}
  \pitem{T} Projektive Bild-Koordinaten.
  \pitem{hvars} Homogene Polynomvariablen \opt.
  \pitem{avars} Affine Polynomvariablen \opt.
  \pitem{nr} Nummer der Koordinatenumgebung \opt.
\end{kopf}

\begin{zweck}
Projiziert die in {\tt T} als Bild-Koordinate angegebene projektive
Transformation. Resultat ist die Bild-Koordinate der
entsprechenden Transformation im affinen Raum ($U\ttsub{nr}$). {\tt hvars}
mu"s ein Element mehr enthalten als {\tt avars}. {\tt nr} ist eine ganze
Zahl zwischen 0 und der Anzahl Elemente von {\tt avars}, Default ist 0.  Default
f"ur {\tt hvars} ist {\tt homvars} und f"ur {\tt avars} {\tt
affvars}.
\end{zweck}

\begin{algo}
{\tt T} wird mittels {\tt affpoly(T,avars,hvars,nr)} und {\tt
affpoint(T,nr)} zum entsprechenden Bildvektor des affinen Raumes.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  AFFTRANS  ________________________________________________________

  affpoint(affpoly(T,hvars,avars,nr),nr)  
\end{verbatim}
\end{code}


\subsection{Lineare Transformationen}

Obwohl mit {\tt appimage} (\ref{appimage}) eine Funktion zur Verf"ugung
gestellt wird, die auch eine direkte Anwendung von Transformationen auf
Polynome zul"a"st, lohnt sich f"ur den linearen Fall ein "Ubergang zur
Matrix-Darstellung. Dies ist besonders dann von Nutzen, wenn mehrere
Transformationen hintereinander ausgef"uhrt werden sollen
(Matrizenmultiplikation mit {\tt linalg[multiply]}), oder wenn die inverse
Transformation (Matrixinversion mit {\tt linalg[inverse]}) bestimmt werden
soll. Mit Hilfe der Determinante ({\tt linalg[det]}) kann auch sofort
festgestellt werden, ob die Transformation $A\/$ aus $\PGL{n}\/$ stammt~: \/$
A \in \PGL{n} \Leftrightarrow |A| \neq 0 $.

\subsubsection{{\tt image2mat}}

\begin{kopf}{image2mat(image,hvars)}
  \pitem{image} Bild-Koordinate mit homogenen Polynomen vom Grad 1.
  \pitem{hvars} Homogene Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Resultat ist die Matrix mit den Koeffizienten von {\tt hvars} in den
linearen, homogenen Polynomen von {\tt image}. Die Koeffizienten aus {\tt
image[i]} bilden den i-ten Zeilenvektor~: der Koeffizient von {\tt
hvars[j]} in {\tt image[i]} steht in der Matrix an der Position (i,j).
Default f"ur {\tt hvars} ist {\tt homvars}.
\end{zweck}
\begin{code}
\begin{verbatim}
# ___  IMAGE2MAT  ________________________________________________________

  genmatrix(image,hvars)  
\end{verbatim}
\end{code}


\subsubsection{{\tt mat2image}}

\begin{kopf}{mat2image(hommat,hvars)}
  \pitem{hommat} Matrix mit den Bild-Koeffizienten. 
  \pitem{hvars} Homogene Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Resultat ist die Bild-Koordinate, wobei die i-te Zeile
von {\tt hommat} das  Koeffiziententupel des i-ten linearen, homogenen
Polynoms ist~: {\tt hom\-mat[i,j]} ist der Koeffizient von {\tt hvars[j]} im
i-ten Polynom der Bild-Koordinate.
Default f"ur {\tt hvars} ist {\tt homvars}.
\end{zweck}
\begin{code}
\begin{verbatim}
# ___  MAT2IMAGE  ________________________________________________________

  convert(multiply(hommat,hvars),list)  
\end{verbatim}
\end{code}


\subsubsection{"Ubersicht}
Sei in $\C^2\/$ eine lineare, affine Koordinatentransformation gegeben~:
\begin{eqnarray*}
  x & \mapsto & ax + by + c \\
  y & \mapsto & dx + ey + f
\end{eqnarray*}
Dann k"onnen folgende "Uberg"ange durchgef"uhrt werden~:

\[
\left( \begin{array}l
	 ax + by + c \\
         dx + ey + f
       \end{array} \right) \harps^1_6
\left( \begin{array}{c}
	 1\\
         ax + by + c \\
         dx + ey + f
       \end{array} \right) \harps^2_5
\left( \begin{array}{c}
	 x_0\\
         ax_1 + bx_2 + cx_0 \\
         dx_1 + ex_2 + fx_0
       \end{array} \right) \harps^3_4
\left( \begin{array}{lll}
	 1 & 0 & 0 \\
         c & a & b \\
         f & d & e
       \end{array} \right)
\]

\begin{center}
\begin{tabular}{l@{\qquad}l}
  $\begin{array}l 1 \quad : \\ 2 \quad : \end{array}\/$ & 
$\left. \begin{array}l \hbox{\tt hompoint}\\ \hbox{\tt hompoly}
\end{array} \quad \right\} \/$ \quad homtrans\\
  $\begin{array}l 3 \quad : \\ 4 \quad : \end{array}\/$ &
$\left. \begin{array}l \hbox{\tt image2mat }\\ \hbox{\tt mat2image } 
\end{array} \right.$\\
  $\begin{array}l 5 \quad : \\ 6 \quad : \end{array}\/$ &
$\left. \begin{array}l \hbox{\tt affpoly}\\ \hbox{\tt affpoint} 
\end{array} \quad \right\} \/$ \quad afftrans\\
\end{tabular}
\end{center}

Der Umgang mit Transformationen ist im Sinne dieses Beispiels in den
Help-Files beschrieben.


\subsection{Spezielle lineare Abbildungen}

Oft wird die Wahl eines Koordinatensystems gefordert, in welchem eine gegebene
Kurve nicht durch die Fundamentalpunkte gehen soll, oder in welchem eine
Singularit"at auf $P_0\/$ zu liegen hat, und die "ubrigen Fundamentalpunkte
nicht auf der Kurve liegen d"urfen. In \name\ sind Prozeduren vorhanden, die
f"ur eine Kurve eine (m"oglichst `einfache') lineare Transformation berechnen,
die solchen Anforderungen gen"ugt. Die Prozeduren sind auf $\PC{2}$
beschr"ankt, da sich die Anwendungen ebenfalls auf die projektive Ebene
beziehen. Eine sinngem"a"se Erweiterung ist m"oglich, erfordert aber rekursive
Programmierung.


\subsubsection{{\tt NonCurvePt}}

\begin{kopf}{NonCurvePt(F,nr,exlist,vars)}
 \pitem{F} Homogenes oder affines Polynom.
 \pitem{nr} Nummer der Koordinatenumgebung \opt.
 \pitem{exlist} Liste mit Ausnahmepunkten \opt.
 \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\pagebreak
\begin{zweck}
In der Koordinatenumgebung $U\ttsub{nr}\/$ wird in der N"ahe des Ursprungs ein
Punkt $P\/$ gesucht, der nicht auf der durch {\tt F} bestimmten Kurve liegt, und
der nicht Element der Ausnahmeliste {\tt exlist} ist. Ist {\tt F} bereits ein
affines Polynom, so er"ubrigt sich der Parameter {\tt nr}.  Default f"ur {\tt
nr} ist 0, f"ur {\tt exlist} die leere Liste {\tt []} und f"ur {\tt vars
getindets(F)}.
\end{zweck}

\begin{algo}
Ist {\tt F} ein homogenes Polynom, so wird {\tt F} bez"uglich $U\ttsub{nr}$
projiziert.  Anschlie"send wird, ausgehend vom Ursprung, in spiralf"ormiger
Abfolge ein Punkt auf dem Gitternetz $\Z^2\/$ gesucht, f"ur welchen
das  Polynom verschieden von Null ist.

\figgraph{spiral.tex}{`Spirale' in der affinen Ebene}{xoeppis}

Ein solcher Punkt kann immer gefunden werden~:

\begin{beweis}\\
Sei $C\/$ eine beliebige algebraische Kurve der Ordnung $n$. Dann kann $C$
h"ochstens $n\/$ Komponenten $x=k_i\/$ ($k_i \in \Z,\; i=1\ldots n_0 \le n$)
enthalten. Dasselbe gilt f"ur Komponenten $y=l\/$ ($l \in \Z$). W"ahle nun $k
\in \Z\/$ so, da"s $x = k\/$ keine Komponente von $C\/$ ist. Gem"a"s Satz von
B\'ezout besitzen $C\/$ und $x = k\/$ h"ochstens $n\/$ Schnittpunkte $(k,y_i)$
($i=1\ldots m \leq n$). Also ist die Menge $\{(k,l) \in \Z^2 \:|\; l \notin
\{y_1,\ldots,y_m\}\}\/$ unendlich. Jeder Punkt dieser Menge wird durch Ablaufen
der Spirale nach endlich vielen Schritten erreicht.
\end{beweis}

\medskip
Der gefundene Punkt wird bez"uglich $U\ttsub{nr}\/$ wieder homogenisiert und hat
z.B.~f"ur {\tt nr}=0 die Form $(1,a,b)$. Der Vorteil des spiralf"ormigen
Vorgehens ist, da"s die ganzen Zahlen $a, b\/$ klein bleiben (oft aus
$\{0,1,-1\}$), was aus Komplexit"atsgr"unden f"ur weiterf"uhrende Berechnungen
von Bedeutung ist.
\end{algo}

\pagebreak
\begin{code}
\begin{verbatim}
# ___  NONCURVEPT  _______________________________________________________ 

  dir:= right;
  v1:=0; v2:= 0;
  while  appoly0(f,[v1,v2],avars) = 0   or  member([v1,v2],exlist) do
    if dir = right then
      v1:= v1+1;
      if v1 > -v2 then dir:= up fi
    elif dir = up then
      v2:= v2+1;
      if v2 = v1 then dir:= left fi
    elif dir = left then
      v1:= v1-1;
      if v1 = -v2 then dir:= down fi
    else # dir = down
      v2:= v2-1;
      if v2 = v1 then dir:= right fi
    fi;
  od;
  if homcase then
    hompoint([v1,v2],nr)
  else
    [v1,v2]
  fi  
\end{verbatim}
\end{code}


\subsubsection{{\tt NonVertexTrans}}

\begin{kopf}{NonVertexTrans(F,prelist,vars)}
  \pitem{F} Homogenes Polynom in 3 Variablen.
  \pitem{prelist} Liste mit h"ochstens 3 Punkten. Der erste soll das Bildelement
von $(1,0,0)$, der zweite von $(0,1,0)$, und der dritte von $(0,0,1)\/$ sein.
  \pitem{vars} Homogene Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Es wird eine lineare Transformation (Matrix) $A\/$ erzeugt , soda"s $A(P_0)\/$
der erste, $A(P_1)\/$ der zweite und $A(P_2)\/$ der dritte Punkt aus der
Vorgabeliste {\tt prelist} ist. Fehlt {\tt prelist}, oder hat die Liste
weniger als drei Punkte, so werden als Bilder f"ur die restlichen
Fundamentalpunkte Punkte gew"ahlt, die nicht auf der von $F\/$ bestimmen Kurve
liegen. Man erh"alt eine Matrix, die angewandt auf $F\/$ eine "aquivalente
Kurve $\tilde{F}\/$ liefert, die nicht durch die Fundamentalpunkte geht.
Default f"ur {\tt vars} ist {\tt homvars}.
\end{zweck}

\begin{algo}
Sei $P = P_0 = (1,0,0) \in C\/$ sowie $P'= (1,a,b)\/$ ein Punkt, der nicht auf
$C$ liegt. Es gilt also $F(P) = 0\/$ und $F(P') \neq 0$. Ferner sei $A\/$ eine
lineare Abbildung aus $\PGL{2}\/$ mit
\[ A(P) = P' \quad \hbox{resp.} \quad A^{-1}(P') = P \]
und $\tilde{F}\/$ das zu $F\/$ projektiv--"aquivalente Polynom
$\tilde{F}(\vec{x}) := F(A\vec{x})$. Dann gilt~:
\[ \tilde{F}(P) = \tilde{F}(A^{-1}(P')) = F(A(A^{-1}(P'))) = F(P') \neq 0 \]
Das neue Polynom $\tilde{F}\/$ ist also an der Stelle $(1,0,0)\/$ nicht mehr 0.
Ist die Vorgabeliste leer, so wird ein Punkt $P_0'$, der nicht auf der Kurve
liegt, mit der Prozedur {\tt NonCurvePt(F,0,vars)} bestimmt. $P_0'\/$ hat dann
die Form $(1,a,b)\/$ ($a, b \in \Z$) und ist gerade der erste Spaltenvektor von
$A$. 

\smallskip 
Analog geht man f"ur den zweiten Fundamentalpunkt vor. Ein Punkt $P_1' \notin
C\/$ wird in $U_1\/$ gesucht, das hei"st $P_1'\/$ wird die Form $(c,1,d)\/$
haben. Es mu"s sichergestellt sein, da"s $P_1'\/$ kein Vielfaches von $P_0'\/$
ist.  Aus $P_1' = kP_0'\/$ ergibt sich als einzige L"osung $k = 1/a\/$ und
$P_1' = (1/a,1,b/a)$, falls $a \neq 0$, und sonst keine L"osung.  Man erh"alt
also einen geeigneten Punkt $P_1'\/$ durch den Aufruf {\tt
NonCurvePt(F,1,[[1/a,1,b/a]], vars)}.

\smallskip
F"ur den dritten Fundamentalpunkt $P_2\/$ sucht man schlie"slich einen Punkt
$P_2' \notin C\/$ in $U_2$. $P_2'\/$ darf allerdings nicht linear von $P_0'\/$
und $P_1'\/$ abh"angen, d.h.~$P_2'\/$ darf nicht auf der durch $P_0'\/$ und
$P_1'\/$ verlaufenden Gerade liegen. Die Koeffizienten dieser Geraden ergeben
sich aus dem Vektorprodukt von $P_0\/$ und $P_1$. $P_2'\/$ hat die Form
$(e,f,1)$ und es mu"s gelten~:

\[ |A| = \left[\left(\begin{array}l 1\\a\\b \end{array} \right) \times 
\left(\begin{array}l c\\1\\d \end{array}\right)\right] \cdot
\left(\begin{array}l e\\f\\1 \end{array}\right) \neq 0 \]

$P_2'\/$ darf also weder auf $C\/$ noch auf der Geraden \[ G(x_0,x_1,x_2) := \:
(ad-b)x_0 + (bc-d)x_1 + (1-ca)x_2 = 0 \] liegen. Ein geeignetes $P_2'\/$ erh"alt
man durch den Aufruf {\tt NonCurvePt(F$\cdot$G,2,vars)}.

Die gesuchte Abbildung $A\/$ ist dann~:
\[ A := \;\left(
\begin{array}{lll}
  1 & c & e \\ a & 1 & f \\ b & d & 1 
\end{array}\right)\]
\end{algo}

\pagebreak
\begin{code}
\begin{verbatim}
# ___  NONVERTEXTRANS  ___________________________________________________ 

  prenr:= nops(prelist);
  for i from 1 to prenr do P[i]:= prelist[i] od;
  if prenr > 1 and iszerolist(convert(crossprod(P[1],P[2]),list)) then
    ERROR(`dependent tupels in list`);
  fi;  
  if prenr = 0 then
    P[1]:= NonCurvePt(F,0,[],vars)
  fi;
  if prenr <= 1 then
    a:= P[1][2];
    if a <> 0 then 
      P[2]:= NonCurvePt(F,1,[ [1/a,1,P[1][3]/a] ],vars)
    else
      P[2]:= NonCurvePt(F,1,[],vars)
    fi  
  fi;
  if prenr <= 2 then
    P[3]:= NonCurvePt(F*dotprod(crossprod(P[1],P[2]),vars),2,[],vars)
  fi;
  transpose(linalg['matrix'](3,3,[P[1],P[2],P[3]])) 
\end{verbatim}
\end{code}

Beispiel~: sei $F\/$ eine ebene algebraische Kurve mit einer Singularit"at in
$(1,1,0)$. Dann erh"alt man mit
\begin{quote}
  \begin{verbatim}
> A:= NonVertexTrans(F,[[1,1,0]],homvars);
> F1:= appmat(A,F);    
  \end{verbatim}
\end{quote}
eine Kurve {\tt F1}, die in $(1,0,0)\/$ eine Singularit"at hat, und die
nicht durch die Fundamentalpunkte $(0,1,0)\/$ und $(0,0,1)\/$ geht.


\medskip 
Bemerkung~: mit einigem Aufwand l"a"st sich das gezeigte Verfahren dahingehend
erweitern, da"s eine Kurve eine {\it beliebige\/} Anzahl von Punkten (also
nicht nur $P_0, P_1, P_2$) meidet. Da sich jedoch daf"ur keine konkrete
Anwendung abzeichnet, wird vorderhand darauf verzichtet.


\subsubsection{{\tt PtTrans}}
\begin{kopf}{PtTrans(L1,L2)}
 \pitem{L1} Liste mit Ausgangskoordinaten \opt.
 \pitem{L2} Liste mit Bildkoordinaten.
\end{kopf}

\pagebreak
\begin{zweck}
Es wird die Abbildungsmatrix $A\/$ bestimmt, welche angewandt auf eine Kurve $C$
eine transformierte Kurve $\tilde{C}\/$ liefert, soda"s die Bildkoordinaten
bez"uglich $\tilde{C}\/$ den Ausgangskoordinaten bez"uglich $C\/$ entsprechen.
Ist z.B.~{\tt L1[1]} $\in C$, so ist auch {\tt L2[1]} $\in \tilde{C}$.  $A$
ist das Inverse der Matrix, welche die Punkte aus {\tt L1} auf die Punkte in
{\tt L2} abbildet. Default f"ur {\tt L1} sind die Fundamentalpunkte 
$(1,0,0),\,(0,1,0),\,(0,0,1)$.
\end{zweck}
\begin{algo}
Sei $(\underline{p})\/$ das Tupel der Koordinaten aus {\tt L1},
$(\underline{e})$ das Tupel der Einheitsvektoren und $(\underline{\hat{p}})\/$
das Tupel der Koordinaten aus {\tt L2}~:

\[ (\underline{p}) \stackrel{A}{\longleftarrow} (\underline{e})
\stackrel{B}{\longrightarrow} (\underline{\hat{p}}) \]

Da in den Spalten einer Matrix jeweils die Bilder der Einheitsvektoren
$(\underline{e})\/$ stehen, sind $A\/$ und $B\/$ die Matrizen mit den
Koordinaten von $(\underline{p})\/$ resp.~$(\underline{\hat{p}})\/$ in den
Spalten.  $BA^{-1}$ ist dann die Abbildung, die $(\underline{p})\/$ in
$(\underline{\hat{p}})\/$ "uberf"uhrt. Das Resultat ist somit $(BA^{-1})^{-1}=
AB^{-1}$.
\end{algo}
\begin{code}
\begin{verbatim}
# ___  PTTRANS  ______________________________________________________ 

  BB:= inverse(transpose(linalg['matrix'](B)));
  if nargs = 1 then RETURN(eval(BB)) fi;
  if nops(A) <> nops(B) then ERROR(`different length of lists`) fi;
  A:= transpose(linalg['matrix'](A));
  multiply(A,BB)  
\end{verbatim}
\end{code}


\section{Verschiedenes}


\subsection{Mehrfachkomponenten}

\subsubsection{{\tt multcomp}}
\begin{kopf}{multcomp(F,vars)}
  \pitem{F} Homogenes oder affines Polynom.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Es wird getestet, ob das multivariate Polynom {\tt F} eine Mehrfachkomponente
besitzt. Resultat ist eine Boolesche Konstante. Default f"ur {\tt vars} ist
{\tt getindets(F)}.
\end{zweck}

\begin{algo}
Kommt eine Variable $x\/$ nicht im Polynom $F\/$ vor, so ist die Diskriminante
$D_F = R_{F,F_x} = R_{F,0} = 0 \/$ ($F_x = \partial F / \partial x$). Kommt sie
aber vor, fa"st man die "ubrigen Variablen als Konstanten aus $\C\/$ auf und
berechnet wie "ublich die Diskriminante. Es gilt also~:
\begin{eqnarray*}
\lefteqn{D_F = 0 \iff} & &\\& & (F \hbox{ besitzt Mehrfachkomponente
bez"uglich } x) \vee (x \hbox{ kommt in $F\/$ nicht vor}) \;.
\end{eqnarray*}

Um eine Mehrfachkomponente auszuschlie"sen, mu"s also die Diskriminante von $F$
bez"uglich aller in $F\/$ vorkommender Variablen verschieden von 0 sein.

Beispiel~: Seien $g_1 \in \C[x]$, $g_2 \in \C[x,y]\/$ und $g_3 \in \C[y]$
Polynome ohne Mehrfachfaktoren. Dann
gilt f"ur \/$ f(x,y) = g_1(x) g_2(x,y) g_3^k(y) \/$ $(k \in \N, k > 1)$
  $R_{f,f_y} = 0\/$ aber $R_{f,f_x} \neq 0$.

\end{algo}

\begin{code}
\begin{verbatim}
# ___  MULTCOMP  ______________________________________________________ 

 for i from 1 to nops(vars) do
   if has(F,vars[i]) and discrim(F,vars[i]) = 0 then RETURN(true) fi
 od;
 RETURN(false)   
\end{verbatim}
\end{code}


\subsection{Gemeinsame Komponenten}

\subsubsection{{\tt commoncomp}}
\begin{kopf}{commoncomp(F,G,vars)}
  \pitem{F,G} Homogene oder affine Polynome ($\neq 0$).
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Es wird getestet, ob die multivariaten Polynome {\tt F} und {\tt G} eine
gemeinsame Komponente besitzen. Resultat ist eine Boolesche Konstante. Default
f"ur {\tt vars} ist {\tt getindets([F,G])}.
\end{zweck}

\begin{algo}
Kommt eine Variable $x\/$ in $F\/$ oder $G\/$ nicht vor, so ist die Resultante
$R_{F,G} \neq 0 $. Kommt sie in beiden Polynomen vor, fa"st man die "ubrigen
Variablen als Konstanten aus $\C\/$ auf und berechnet wie "ublich die
Resultante. Bez"uglich einer gemeinsamen Variablen $x\/$ von $F\/$ und $G\/$
gilt~:
\begin{eqnarray*}
\lefteqn{R_{F,G} = 0 \iff} & &\\& & (F, G \hbox{ haben bez"uglich $x\/$ eine
gemeinsame Komponente}) \;.
\end{eqnarray*}

Um eine gemeinsame Komponente auszuschlie"sen, mu"s also die Resultante von
$F\/$ und $G\/$ bez"uglich aller gemeinsamer Variablen verschieden von 0 sein.
\end{algo}
\begin{code}
\begin{verbatim}
# ___  COMMONCOMP  ______________________________________________________ 

  for i from 1 to nops(vars) do
    if has(F,vars[i]) and has(G,vars[i]) then
      if resultant(F,G,vars[i]) = 0 then RETURN(true) fi
    fi  
  od;
  RETURN(false)   
\end{verbatim}
\end{code}


\subsection{Nullstellensuche und Faktorisierung} 
In \maple\ ist keine multivariate, algebraische Faktorisierung f"ur Polynome
mit Koeffizienten aus $\C\/$ implementiert. {\tt factor} faktorisiert im
wesentlichen Polynome mit Koeffizienten aus $\Q$. F"ur den univariaten Fall
k"onnen die Nullstellen mit {\tt solve(eqn,var)} ({\tt solve/scalar}) bestimmt
werden. F"ur Polynome bis zum Grad 4 findet {\tt solve} alle L"osungen. F"ur
h"ohere Grade enthalten die L"osungen (u.U.) {\tt RootOf}--Ausdr"ucke.  F"ur
\name\ wird haupts"achlich die Faktorisierung eines homogenen Polynoms in zwei
Variablen ben"otigt.  Solche Polynome lassen sich auf univariate Polynome
zur"uckf"uhren und in Linearfaktoren zerlegen. Dieser Umstand wird ausgenutzt,
um {\tt solve/scalar} verwenden zu k"onnen, welcher `bessere' L"osungen als
{\tt solve} f"ur bivariate Polynome liefert.

\subsubsection{{\tt homxyfac}}
\begin{kopf}{homxyfac(F,vars)}
  \pitem{F} Homogenes Polynom in 2 Variablen.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Das homogene Polynom {\tt F} wird "uber $\C\/$ faktorisiert. Resultat ist eine
Liste mit Linearfaktoren. Mehrfach auftretende Faktoren werden mit
entsprechendem Exponenten eingetragen.  {\tt vars} mu"s zwei Elemente
enthalten, Default ist {\tt affvars}.
\end{zweck}

\begin{algo}
Sei $F(x,y)\/$ das homogene Polynom und der Grad $n$. Dann hat $F\/$ die
Gestalt \[ F(x,y) = x^k y^l G(x,y) \qquad x \nmid G,\,y \nmid G, \: k+l \le
n\] Somit ist $G\/$ ein homogenes Polynom vom Grad $n' = n-(k+l)$. Die
Faktoren $x^k$ und $y^l\/$ werden durch Polynomdivision bestimmt. Das affine
Polynom
\[g(y) := G(1,y)\] 
hat dann ebenfalls Grad $n'\/$ und zerf"allt in Linearfaktoren~:
\[g(y) = (y - a_1)(y - a_2) \cdots (y-a_{n'}) \]
Die Nullstellen $a_1,\ldots,a_{n'}\/$ werden mit {\tt solve/scalar} bestimmt.
Jeder Faktor von $g\/$ entspricht einem Faktor von $G$,
\[ (y-a_i) \;\mapsto\; x(\frac{y}{x}-a_i) = (y - a_ix) \]
und die Nullstellen von $G\/$ sind $(1,a_1),\ldots,(1,a_{n'})$. Vor der
Transformation zu linearen Faktoren werden die Nullstellen mit {\tt
standard} vereinfacht.
\end{algo}
\begin{code}
\begin{verbatim}
# ___  HOMXYFAC  ______________________________________________________ 
  
  S:= NULL;
  G:= F;
  for i from 1 to 2 do
    for k from 0 do
      r:= rem(G,vars[i],vars[i],'G');
      if r <> 0 then  G:= G*vars[i]+r; break fi
    od;
    if k > 0 then S:= S,vars[i]^k fi
  od;  
  sols:= [solve(subs(vars[1]=1,G),vars[2])]; Grts:= [];
  for i from 1 to nops(sols) do
    if not member(sols[i],Grts,'k') then
      Grts:= [op(Grts),sols[i]];
      multtab[nops(Grts)]:= 1
    else
      multtab[k]:= multtab[k]+1
    fi
  od;      
  [S,seq( (vars[1]*numer(Grts[i])-denom(Grts[i])*vars[2])^multtab[i],
          i=1..nops(Grts))]
\end{verbatim}
\end{code}


\subsection{Funktionen}

F"ur viele Zwecke wird eine `Anwendung' von Polynomen oder Listen von
Polynomen auf Koordinatentupel ben"otigt, meist um zu testen, ob das Resultat
von 0 verschieden ist. Ein Polynom $F \in \Cxk{n}\/$ wird als Funktion 
\[ (x_0,\ldots,x_n) \mapsto F(x_0,\ldots,x_n) \]
interpretiert. Analog wird ein Tupel von Polynomen $(F_0,\ldots,F_k) \in
\Cxk{n}^k \/$ als
Funktion 
\[ (x_0,\ldots,x_n) \mapsto \left(\begin{array}c
    F_0(x_0,\ldots,x_n) \\ \vdots \\ F_k(x_0,\ldots,x_n)
			    \end{array}\right) \]
aufgefa"st. Die Prozedur {\tt appoly} bestimmt die Bilder von Koordinaten aus
$\PC{n}\/$ bez"uglich solcher Funktionen.

\subsubsection{{\tt appoly}}

\begin{kopf}{appoly(arg,pt,vars)}
  \pitem{arg} Polynom oder Liste von Polynomen.
  \pitem{pt}  Koordinate oder Liste von Koordinaten.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Die Koordinaten {\tt pt} werden f"ur die Variablen {\tt vars} in {\tt arg}
eingesetzt und das Resultat gegebenenfalls vereinfacht. Das Resultat ist in $
\C\/$ oder $\C[\ldots]\/$ falls {\tt arg} ein Polynom ist, und in $\C^n\/$ oder
$\C[\ldots]^n\/$ im Falle eines Vektors von Polynomen (`$\ldots$' steht hier
f"ur die Unbestimmten aus {\tt pt} und $n\/$ f"ur die Vektordimension von {\tt
arg}). {\tt vars} mu"s gleichviele Elemente wie {\tt pt} enthalten. Default
f"ur {\tt vars} ist {\tt getindets(arg)}.
\end{zweck}

\begin{code}
\begin{verbatim}
# ___  APPOLY  ___________________________________________________________
  
appoly0 := proc(F,pt,vars)
local i;
  subs ( [seq(vars[i] = pt[i], i=1..nops(pt))] , F )
end:  

  ...
  if type(pt,listlist) then 
    if nops(pt[1]) <> nops(vars) then ERROR(`dimension mismatch`) fi;
    RETURN( [seq( appoly0(F,pt[i],vars), i=1..nops(pt) )] )
  else 
    if nops(pt) <> nops(vars) then ERROR(`dimension mismatch`) fi;
    RETURN(appoly0(F,pt,vars))
  fi  
\end{verbatim}
\end{code}

\subsubsection{{\tt appimage}}
\label{appimage}
\begin{kopf}{appimage(im,F,vars)}
  \pitem{im} Bild-Koordinate (Liste von Polynomen).
  \pitem{F}  Polynom.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Das Polynom {\tt F} wird bez"uglich der Bild-Koordinate {\tt im}
transformiert. Default f"ur {\tt vars} ist {\tt getindets([im,F])}.
\end{zweck}

\begin{algo}
Fa"st man {\tt F} als Funktion auf, so ist {\tt F} an der Stelle {\tt im}
das transformierte Polynom. Mit {\tt appoly(F,im,vars)} erh"alt man das
gew"unschte Resultat.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  APPIMAGE  _________________________________________________________

  appoly0(F,im,vars)  
\end{verbatim}
\end{code}


\subsubsection{{\tt appmat}}
\begin{kopf}{appmat(mat,arg,vars)}
  \pitem{mat} Matrix mit Transformationskoeffizienten.
  \pitem{arg} Polynom oder Koordinate oder Liste von Koordinaten.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
`Anwendung' einer durch {\tt mat} gegebenen linearen Transformation auf {\tt
arg}. Falls {\tt arg} ein Polynom ist, so wird das bez"uglich {\tt mat}
projektiv "aquivalente Polynom bestimmt. Ist {\tt arg} eine Koordinate oder
eine Liste von Koordinaten, so werden die Elemente von {\tt arg} mit {\tt mat}
abgebildet. Default f"ur {\tt vars} ist {\tt homvars}.
\end{zweck}
\begin{code}
\begin{verbatim}
# ___  APPMAT  ___________________________________________________________

  if polycase then
    if not type(F,projpoly(vars)) then
      ERROR(`second argument is not a homogeneous polynomial in`,vars)
    fi;  
    imlist:= convert(multiply(mat,vars),list);  
    appoly0 (F,imlist,vars)
  elif type(F,listlist) then
    [seq( convert(multiply(mat,F[i]),list), i=1..nops(F))]
  else
    convert(multiply(mat,F),list)  
  fi     
\end{verbatim}
\end{code} 









% Master File: algcurve.tex

\section {Singularit"aten und Tangenten}

In der Projektiven Geometrie definiert man Singularit"aten einer Kurve als
Punkte, in welchen die Kurve --- mit Multiplizit"aten gez"ahlt --- mehr als eine
Tangente besitzen.

\subsection {Singul"are Punkte}

\begin{definition}\\ 
Sei $C\/$ eine ebene komplexe projektiv-algebraische Kurve und $p\/$ ein
Punkt auf $C$. Seien $(x,y)\/$ die affinen Koordinaten, in welchen $p\/$
die Koordinaten $(a,b)\/$ und $C\/$ die affine Gleichung $f(x,y) = 0\/$
hat.
\begin{enumgjlett}

  \item Die {\it Multiplizit"at\/} $\nu_p(C)\/$ von $C\/$ bei $p\/$ ist
die Ordnung des kleinsten nicht-verschwin\-den\-den Terms in der
Taylor--Entwicklung von $f\/$ an der Stelle $p$.

  \item Die {\it Tangenten\/} an $C\/$ bei $p\/$ sind die Geraden durch $p$,
welche $C\/$ mit Multiplizit"at gr"o"ser als $\nu_p(C)\/$ schneiden. $C\/$ hat
mit Multiplizit"aten gez"ahlt genau $\nu_p(C)\/$ Tangenten in $p$.

  \item
\begin{tabular}[t]{@{$p\/$ hei"st \quad} l @{\quad falls $\;\nu_p(C)\;$}l}
  {\it Regul"arer Punkt\/} von $C\/$ & = 1\\ {\it Singul"arer Punkt\/} von $C\/$ &
$>\/$ 1\\ {\it Doppelpunkt\/} von $C\/$ & = 2\\ {\it Tripelpunkt} von $C\/$ & = 3
\end{tabular}
  \item $p\/$ hei"st {\it gew"ohnlicher} $n$--facher Punkt von $C$, falls $C$
genau $n = \nu_p(C)\/$ verschiedene Tangenten in $p\/$ hat.

\end{enumgjlett}

\end{definition}

\begin{bemerkung}\\ 
Die Tangenten k"onnen berechnet werden, indem in der Taylor--Entwicklung von
$f\/$ in $p$, 
\[ f(x,y) \:=\: \sum_{\nu = 0}^\infty \,\frac{1}{\nu !} \: 
   \sum_{i=0}^\nu {\nu \choose i} \frac{\partial^\nu f}{\partial x^i \partial
   y^{\nu-i}} (a,b) (x-a)^i (y-b)^{\nu-i} \] 
der kleinste nicht-verschwindende Term Null gesetzt wird.
\end{bemerkung}
\bew{5.3}

\begin{satz}\\ 
Sei $C\/$ eine ebene komplexe projektive algebraische Kurve, die durch die
homogene Gleichung $F(x_0,x_1,x_2)=0\/$ bestimmt ist, und $p\/$ ein Punkt von $C$.
Dann ist $\nu_p(C) = r\/$ genau dann, wenn alle partiellen Ableitungen von $F$
bis und mit Ordnung $r-1\/$ an der Stelle $p\/$ verschwinden.
\end{satz}
\bew{5.3.2}

\begin{korollar}\\ 
Sei $C \subset \PC{2}\/$ eine ebene Kurve der Ordnung $m$, die durch die
homogene Gleichung $F(x_0,x_1,x_2) = 0\/$ bestimmt ist. Dann sind die Punkte $p
\in C\/$ mit $\nu_p(C) \ge r\/$ ($r \le m$) genau die Punkte von $\PC{2}$, in
welchen alle $(r-1)$-ten partiellen Ableitungen verschwinden. Im besonderen
sind die singul"aren Punkte diejenigen Punkte von $\PC{2}$, in welchen alle
ersten partiellen Ableitungen verschwinden.
\end{korollar}
\bew{5.3.3}

\begin{satz}\\ 
Die Gleichung der Tangente an einen regul"aren Punkt $p\/$ der Kurve $C\/$ mit 
homogener Gleichung $F(x_0,x_1,x_2) = 0\/$ ist 
\[ \sum_{i=0}^2 x_i \Dp{F}{i}(p) = 0 \;. \]
\end{satz}
\bew{5.3.4}


\begin{definition}\\ Der Vektor--Gradient einer Funktion $F\/$ "uber $n$
Variablen $x_1,\ldots,x_n\/$ ist definiert durch \[ \hbox{Grad}(F)\: := \;
\left( \Dp{F}{1}, \Dp{F}{2},\, \cdots\,, \Dp{F}{n} \right) \]
\end{definition}


\subsubsection{{\tt grad}}
\begin{kopf}{grad(F,vars)}
 \pitem{F} Homogenes oder affines Polynom.  \pitem{vars} Polynomvariablen
\opt.
\end{kopf}
\begin{zweck}
Es wird der Vektorgradient von {\tt F} bez"uglich dem Variablentupel {\tt
vars} bestimmt.
\end{zweck}

\begin{code}
\begin{verbatim}
# ___  GRAD  ______________________________________________________
  
  [seq(diff(F,vars[i]),i=1..nops(vars))]
\end{verbatim}
\end{code}

\pagebreak
Beispiel~:
\begin{quote}
  \begin{verbatim}
> grad( y^2 + x^3 - x^2, [x,y] );
                                   2
                              [ 3 x  - 2 x, 2 y ]    
  \end{verbatim} \end{quote}
Bemerkung~: die Funktion ist beinahe identisch zu {\tt linalg[grad]}. Der
Unterschied besteht darin, da"s die Variablen optional sind, und da"s das
Resultat nicht als Vektor sondern als Liste zur"uckgegeben wird.


\subsubsection{{\tt singularities}}
\begin{kopf}{singularities(F,vars)}
 \pitem{F} Homogenes oder affines Polynom in 3 resp.~2 Variablen.
\pitem{vars} Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Das Resultat ist eine Liste mit den Koordinaten der singul"aren Punkte. Im
homogenen Fall ist die Liste vollst"andig (eventuell mit {\tt
RootOf}--Aus\-dr"ucken), f"ur affine Polynome erscheinen nur die Singularit"aten
in der affinen Ebe\-ne.  Homogene Koordinaten werden mit {\tt standard}
vereinfacht. Default f"ur {\tt vars} ist {\tt getindets(F)}.
\end{zweck}

\begin{algo}
Mit der Funktion {\tt grad(F,vars)} wird der Vektorgradient bestimmt. Gesucht
ist eine gemeinsame Nullstelle der 3 resp.~2 ersten partiellen Ableitungen.
Die Gleichungen werden mit {\tt solve} gel"ost. F"ur jedes L"osungstupel wird
getestet, ob {\tt F} an der Stelle null ist. Im homogenen Fall werden die
L"osungen mit {\tt standard} vereinfacht.

Bemerkung~: Es gibt noch andere M"oglichkeiten zur Bestimmung der
Singularit"aten. So erh"alt man sie auch durch Schnitt der Kurve mit einer
Polaren (vgl.~\ref{Polar}) oder mit ihrer Hessschen Kurve
(vgl.~\ref{Hessian}). F"ur den Schnitt von Kurven mu"s jedoch auch auf {\tt
solve} zur"uckgegriffen werden. Es ist unklar, ob auf diese Weise mehr
singul"are Punkte ohne {\tt RootOf}--Ausdr"ucke bestimmt werden k"onnen.
Umgekehrt kann das Schnittproblem auch auf die Singularit"atensuche
zur"uckgef"uhrt werden, da gemeinsame Schnittpunkte zweier Polynome $F\/$ und
$G\/$ Singularit"aten von $F\cdot G\/$ sind.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  SINGULARITIES  ____________________________________________________

  sols:= [solve(convert(grad(F,vars),set),convert(vars,set))];
  sols:= [seq(subs(sols[i],eval(vars)),i=1..nops(sols))];
  homcase:= evalb( nops(vars) = 3  and type(F,projpoly(vars) ));
  if homcase then
    oncurve:= unapply('evalb'('not iszerolist(t) and  
                       appolyE'(F,t,vars)=0),t);
    RETURN (map(standard,select(oncurve,sols)))
  else
    oncurve:= unapply('evalb'('appolyE'(F,t,vars)=0),t);
    RETURN (select(oncurve,sols))        
  fi  
\end{verbatim}
\end{code}


\subsubsection{{\tt isregular}}
\begin{kopf}{isregular(F,pt,vars)}
  \pitem{F} Homogenes oder affines Polynom.
  \pitem{pt} Homogene oder affine Koordinate.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Es wird getestet, ob {\tt pt} ein regul"arer Punkt der durch {\tt F}
bestimmten Kurve ist. Enth"alt {\tt pt} Unbestimmte, so wird angenommen, da"s
{\tt pt} auf der Kurve liegt. Resultat ist eine Boolesche Konstante.  Default
f"ur {\tt vars} ist {\tt getindets(F)}.
\end{zweck}

\begin{code}
\begin{verbatim}
# ___  ISREGULAR  ______________________________________________________

  ( appolyE(F,pt,vars) = 0  or  indets(pt,name) <> {} )  and  
  not iszerolist(appoly0(grad(F,vars),pt,vars))  
\end{verbatim}
\end{code}


\subsubsection{{\tt issingular}}
\begin{kopf}{issingular(F,pt,vars)}
  \pitem{F} Homogenes oder affines Polynom.
  \pitem{pt} Homogene oder affine Koordinate.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Es wird getestet, ob {\tt pt} ein singul"arer Punkt der durch {\tt F}
bestimmten Kurve ist.  Resultat ist eine Boolesche Konstante.  Default f"ur
{\tt vars} ist {\tt getindets(F)}.
\end{zweck}

\begin{code}
\begin{verbatim}
# ___  ISSINGULAR  ______________________________________________________

  appolyE(F,pt,vars) = 0  and  iszerolist(appolyE(grad(F,vars),pt,vars))
\end{verbatim}
\end{code}


\subsubsection{{\tt isordinary}}
\begin{kopf}{isordinary(F,pt,vars)}
  \pitem{F} Homogenes oder affines Polynom.
  \pitem{pt} Homogene oder affine Koordinate.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Es wird getestet, ob {\tt pt} ein gew"ohnlicher Punkt der durch {\tt F}
bestimmten Kurve ist.  Resultat ist eine Boolesche Konstante.  Default f"ur
{\tt vars} ist {\tt getindets(F)}.
\end{zweck}
\begin{algo}
Ist {\tt pt} ein regul"arer Punkt ({\tt isregular}), so ist das Resultat {\tt
true}. Liegt {\tt pt} nicht auf der Kurve, so ist das Resultat {\tt false}.
F"ur einen singul"aren Punkt wird aus der Taylor--Entwicklung an der Stelle
{\tt pt} der niedrigste nicht-verschwindende Term extrahiert. Mit {\tt
multcomp} wird auf eine Mehrfachkomponente getestet.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  ISORDINARY  ______________________________________________________
  
  tay:= subs( [ seq( vars[i]=vars[i]+pt[i], i=1..nops(pt) ) ],
              curvetaylor(F,pt,vars));
  varset:= convert(vars,set);
  if not type(tay,`+`) then 
    lowterm:= tay 
  else 
    sfn:= unapply('evalb'('degree'(t,varset)=ldegree(tay,varset)),t);
    lowterm:= select(sfn,tay) 
  fi;
  not multcomp(lowterm,vars)
\end{verbatim}
\end{code}

\subsection {Taylor--Entwicklung und Multiplizit"at}

\subsubsection{{\tt curvetaylor}}
\begin{kopf}{curvetaylor(F,pt,vars)}
  \pitem{F} Homogenes oder affines Polynom.
  \pitem{pt} Homogene oder affine Koordinate.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\pagebreak
\begin{zweck}
Es wird die vollst"andige Taylor--Entwicklung von {\tt F} an der Stelle {\tt
pt} berechnet. Enth"alt {\tt pt} Unbestimmte, so wird
angenommen, da"s der Punkt auf der Kurve liegt, und der konstante Term wird
entfernt.  Default f"ur {\tt vars} ist {\tt getindets(F)}.
\end{zweck}

\begin{code}
\begin{verbatim}
# ___  CURVETAYLOR  ______________________________________________________

  tay:= readlib(mtaylor) ( F, [ seq(vars[i]=pt[i], i=1..nops(pt)) ], 
                           degree(F,varset) + 1 );
  if indets(pt,name) <> {} then
    tmp:= subs( [ seq( vars[i]=vars[i]+pt[i], i=1..nops(pt) ) ], tay);
    if ldegree(tmp,varset) = 0 then
      RETURN(tay-tcoeff(tmp,varset))
    fi  
  fi;
  eval(tay)  
\end{verbatim}
\end{code}

\subsubsection{{\tt multiplicity}}
\begin{kopf}{multiplicity(F,pt,vars)}
  \pitem{F} Homogenes oder affines Polynom.
  \pitem{pt} Homogene oder affine Koordinate (od.~Liste von Koordinaten).
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Sei $C\/$ die von {\tt F} bestimmte Kurve und $p\/$ der Punkt, der durch die
Koordinate {\tt pt} gegeben ist. Es wird die Multiplizit"at $\nu_p(C)$
bestimmt. Default f"ur {\tt vars} ist {\tt getindets(F)}.
\end{zweck}

\begin{algo}
Mit {\tt curvetaylor(F,pt,vars)} wird die Taylor--Entwicklung von {\tt F} an
der Stelle {\tt pt} bestimmt. Das Resultat ist der Grad des kleinsten
nicht-verschwindenden Terms. Enth"alt {\tt pt}  Unbestimmte, so
wird angenommen, da"s der Punkt auf der Kurve liegt (vgl.~{\tt curvetaylor}),
und die Multiplizit"at wird als 1 angenommen, wenn in der Taylor--Entwicklung
ein konstanter Term auftritt.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  MULTIPLICITY  _____________________________________________________

  if pt = [] then RETURN([]) fi;
  isptlist:= type(pt,listlist);
  if isptlist then lpt:= pt else lpt:= [pt] fi;
  if nops(lpt[1]) <> nops(vars) then
    ERROR(`dimension mismatch`)
  fi;
  res:= NULL;
  varset:= convert(vars,set);
  for k from 1 to nops(lpt) do
    tmp:= subs( [ seq( vars[i]=vars[i]+lpt[k][i], i=1..nops(lpt[k]) ) ],
                 curvetaylor(F,lpt[k],vars));
    res:= res, ldegree(expand(tmp),varset)
  od;
  if isptlist then RETURN([res]) else RETURN(eval(res)) fi   
\end{verbatim}
\end{code}


\subsection {Tangenten}

\subsubsection{{\tt tangent}}
\begin{kopf}{tangent(F,pt,vars)}
  \pitem{F} Homogenes oder affines Polynom.
  \pitem{pt} Homogene oder affine Koordinaten.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Es wird die Tangente von {\tt F} im Punkt {\tt pt} berechnet.  Falls {\tt pt}
nicht auf der durch {\tt F} bestimmten Kurve liegt, erscheint eine
Fehlermeldung.  Enth"alt {\tt pt} Unbestimmte, so wird angenommen, da"s {\tt
pt} auf der Kurve liegt.  Im singul"aren Fall werden (bis auf {\tt
RootOf}--Ausdr"ucke) {\it alle\/} Tangenten ermittelt und als Liste
zur"uckgegeben. Mehrfachtangenten sind mit dem entsprechenden Exponenten
eingetragen.  Default f"ur {\tt vars} ist {\tt getindets(F)}.
\end{zweck}

\begin{algo}
In allen F"allen wird zuerst der Gradient {\tt grad(F,vars)}
berechnet. Dieser wird auf den Punkt {\tt pt} angewendet. Ist das Resultat
verschieden vom Null-Tupel (regul"arer Punkt), so werden die
Tangentenpolynome als Skalarprodukt des Gradienten mit dem Variablen-Vektor
(affin mit {\tt vars-pt}) bestimmt. Habe {\tt pt} die
Koordinaten $(a,b)\/$ (Punkt in der affinen Ebene) und sei {\tt F} das Polynom
$f(x,y)$, so wird, falls $p\/$ nicht singul"ar ist, die affine Tangentengleichung
\[ \frac{\partial f}{\partial x}(a,b)(x-a) + \frac{\partial f}{\partial
y}(a,b)(y-a) \]
bestimmt. Ist {\tt F} ein homogenes Polynom $F(x_0,x_1,x_2)\/$ und {\tt pt} ein
nicht-singul"arer Punkt $p \in \PC{2}\/$ so wird die Tangentengleichung
\[ \sum_{i=0}^2 x_i \Dp{F}{i}(p) = 0 \]
bestimmt.

Ist der Punkt singul"ar, so wird der homogene Fall auf den affinen  durch
Projektion in eine geeignete Koordinatenumgebung $U_i\/$ zur"uckgef"uhrt.
Ist $f(x,y)\/$ das affine Polynom und $p=(a,b)\/$ der affine Punkt, so wird aus
der Taylor--Entwicklung von $f\/$ an der Stelle $p\/$ der niedrigste
nicht-verschwindende Term extrahiert. Durch Ersetzung von $(x-a)\/$ und $(y-b)$
durch $u\/$ und $v\/$ erh"alt man daraus ein homogenes Polynom $G\/$ in den zwei
Variablen $u\/$ und $v$. Mit der Prozedur {\tt homxyfac} wird die Liste der
Faktoren von $G\/$ bestimmt, in welcher $u, v\/$ wieder durch $(x-a)\/$ und $(y-b)$
ersetzt werden. Dadurch ist die Liste der Tangentenpolynome gegeben. F"ur den
homogenen Fall m"ussen die Polynome bez"uglich der gew"ahlten
Koordinatenumgebung wieder homogenisiert werden.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  TANGENT  ______________________________________________________
  
singtangent := proc(f,pt,vars)
local tay,varset,lowterm,t,sfn,i;
  tay:= subs( [ seq( vars[i]=vars[i]+pt[i], i=1..nops(pt) ) ],
              curvetaylor(f,pt,vars));
  varset:= convert(vars,set);
  sfn:= unapply('evalb'('degree'(t,varset)=ldegree(tay,varset)),t);
  lowterm:= select(sfn,tay);
  subs( [ seq( vars[i]=vars[i]-pt[i], i=1..nops(pt) ) ],
        homxyfac(lowterm,vars) )
end:

  ...
  gr:= grad(F,vars);
  if not iszerolist(appolyE(gr,pt,vars)) then   # regular point
    if homcase then
      RETURN (dotprod ( vars, appoly(gr,pt,vars) ))
    else
      RETURN (dotprod ( [seq(vars[i]-pt[i],i=1..nops(vars))], 
                        appoly(gr,pt,vars) )) 
    fi
  fi;
  if homcase then
    for nr from 0 to nops(pt)-1 while pt[nr+1] = 0 do od;
    avars:= affvars;
    tmp:= singtangent(affpoly(F,vars,avars,nr),affpoint(pt,nr),avars);
    RETURN(hompoly(tmp,avars,vars,nr))
  else
    RETURN(singtangent(F,pt,vars))
  fi 
\end{verbatim}
\end{code}


\subsection {Regul"are Punkte}

\subsubsection{{\tt RegCurvePts}}
\begin{kopf}{RegCurvePts(F,nrofpts,vars)}
  \pitem{F} Homogenes oder affines Polynom in 3 resp.~2 Variablen.
  \pitem{nrofpts} Anzahl geforderter Punkte.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Es werden {\tt nrofpts} verschiedene, m"oglichst `einfache' regul"are Punkte
auf der von {\tt F} bestimmten Kurve ermittelt. Resultat ist eine Liste mit
{\tt nrofpts} homogenen oder affinen Koordinaten. Default f"ur {\tt vars} ist
{\tt getindets(F)}.
\end{zweck}
\begin{algo}
Ist {\tt F} ein affines Polynom, so wird {\tt F} homogenisiert. {\tt F} wird
mit {\tt standard} vereinfacht. F"ur jede Koordinatenumgebung $U_i\/$ ($i=0..2$)
wird das assoziierte Polynom bestimmt. Sei $f\/$ das affine Polynom in den
Variablen $x\/$ und $y$.  $f\/$ wird mit einer Reihe von Geraden nahe dem Ursprung
geschnitten, n"amlich mit $x-k$, $x+k$, $y-k$, und $y+k\/$ ($k \in \N$), wobei
$k\/$ ausgehend von 0 solange erh"oht wird, bis man gen"ugend verschiedene
Schnittpunkte hat.  Die Schnittpunkte werden homogenisiert ({\tt hompoint}).
Ist $f\/$ ein Polynom mit rationalen Koeffizienten, so wird das Verfahren zuerst
mit Hilfe von {\tt isolve} durchgef"uhrt, um wenn m"oglich ganzzahlige
L"osungen zu erhalten. Nur falls nicht gen"ugend ganzzahlige L"osungen
gefunden wurden, wird das Verfahren mit {\tt solve} durchgef"uhrt. War {\tt F}
ein affines Polynom, so werden die Schnittpunkte wieder projiziert. Dadurch
werden ganzzahlige homogene Koordinaten unter Umst"anden zu rationalen affinen
Koordinaten.  D.h.~es werden im affinen Fall nicht nur ganzzahlige regul"are
Beispielpunkte gefunden, sondern auch gewisse rationale Punkte.
\end{algo}

\pagebreak
\begin{code}
\begin{verbatim}
# ___  REGCURVEPTS  ______________________________________________________ 
  

cPoints := proc (f,oldptset,nrofpts,vars)
local ptset, sols,sols1,sols2, j,ii, isreg,t;
  ptset:= oldptset;
  isreg:= unapply('isregular'(f,t,vars),t);
  for ii from 0 to 10 while nops(ptset) < nrofpts do 
    sols1:= { solve(subs(vars[1]=ii, f), vars[2]) };
    sols2:= { solve(subs(vars[1]=-ii,f), vars[2]) };
    sols:= { seq([ ii,sols1[j] ], j=1..nops(sols1)) } union
           { seq([-ii,sols2[j] ], j=1..nops(sols2)) };
    sols1:= { solve(subs(vars[2]=ii, f), vars[1]) };
    sols2:= { solve(subs(vars[2]=-ii,f), vars[1]) };
    sols:= sols union { seq([sols1[j], ii], j=1..nops(sols1)) } 
                union { seq([sols2[j],-ii], j=1..nops(sols2)) };
    ptset:= ptset union select(isreg,sols)
  od;
  eval(ptset)
end:

getPoints := proc(F,hvars,avars,homcase,oldptset,nrofpts,pointproc)
local f,ptset,ptsetnr,nr,sel,sel0,t;
  ptset:= oldptset;
  sel0:= unapply('evalb'(t[1]=0),t );
  for nr from 0 to 2 while nops(ptset) < nrofpts do
    f:= affpoly(F,hvars,avars,nr);
    ptsetnr := map(affpoint,ptset,nr);
    ptsetnr := pointproc(f,ptsetnr,nrofpts,avars);
    ptsetnr := map(hompoint,ptsetnr,nr);
    if not homcase then ptsetnr := ptsetnr minus select(sel0,ptsetnr) fi;
    sel := unapply( 'evalb'(t[nr+1]=0),t );
    ptset:= select(sel,ptset) union ptsetnr
  od;
  eval(ptset)
end:

  ...
  F:= standard(F,hvars);
  if type(F,polynom(rational,hvars)) then
    ptset:= getPoints(F,hvars,avars,homcase,ptset,nrofpts,iPoints)
  fi;
  if nops(ptset) < nrofpts then
    ptset:= getPoints(F,hvars,avars,homcase,ptset,nrofpts,cPoints)
  fi;
  ptlist:= convert(ptset,list);
  if homcase then
    [sort(map(standard,ptlist),shorter)[1..min(nrofpts,nops(ptlist))]]
  else
    ptlist:= affpoint(ptlist);
    [sort(ptlist,shorter)[1..min(nrofpts,nops(ptlist))]]
  fi
\end{verbatim}
\end{code}



\subsection{Polare}
\label{Polar}

\begin{definition}\\
Sei $C\/$ eine ebene Kurve der Ordnung $n\/$ mit der homogenen Gleichung
$F(x_0,x_1,x_2)=0\/$ und $y = (y_0,y_1,y_2) \in \PC{2}\/$ ein Punkt, f"ur welchen
das homogene Polynom
\[ D_y^1 F(x_0,x_1,x_2) := \sum_{i=0}^2 y_i \Dp{F}{i}(x_0,x_1,x_2) \]
nicht identisch verschwindet. Dann hei"st die Kurve der Ordnung $n-1\/$ mit der
Gleichung $D_y^1F = 0\/$ {\it die erste Polare\/} oder kurz {\it Polare} von $C$
relativ zum Punkt $y$.
\end{definition}

\begin{bemerkung}
\begin{enumgjlett}
  \item Die erste Polare ist genau dann nicht definiert, wenn $y\/$ ein
$n$--facher Punkt von $C\/$ ist.
  \item Die Tangente an $C\/$ in einem regul"aren Punkt $(x_0,x_1,x_2)\/$ lautet~:
\[ \xi_0 \Dp{F}{0}(x_0,x_1,x_2) + \xi_1 \Dp{F}{1}(x_0,x_1,x_2) + \xi_2
\Dp{F}{2}(x_0,x_1,x_2) \] 
F"ur den Moment sind $x_0,x_1,x_2\/$ konstant und $\xi_0,\xi_1,\xi_2\/$ variabel.
Liegt ein Punkt $p = (a_0,a_1,a_2)\/$ auf dieser Tangente, so mu"s er dieser
linearen Gleichung gen"ugen. Man erh"alt also~:
\[ a_0 \Dp{F}{0}(x_0,x_1,x_2) + a_1 \Dp{F}{1}(x_0,x_1,x_2) + a_2
\Dp{F}{2}(x_0,x_1,x_2) = 0 \hbox{\hspace*{2ex}} (*) \] 

Betrachtet man nun $a_0,a_1,a_2\/$ als konstant in dieser Gleichung und
$x_0,x_1,x_2\/$ als variabel, d.h.~betrachtet man $(*)\/$ als Gleichung einer
ebenen Kurve $\tilde{C}\/$ der Ordnung $(n-1)$, dann sind die Schnittpunkte
von $\tilde{C}\/$ mit $C\/$ gerade diejenigen Punkte von $C$, deren Tangenten
durch $p\/$ laufen. Pr"aziser~: es sind diejenigen Punkte $q_i\/$ von $C$,
f"ur welche die Gerade durch $q_i\/$ und $p\/$ die Kurve $C\/$ bei $q_i\/$ mit
Multiplizit"at gr"o"ser als eins schneiden. Darunter sind auch die Punkte
$q_j$, f"ur welche die Gerade durch $q_j\/$ und $p\/$ eine Tangente an $C\/$
ist. Aber es erscheinen auch die singul"aren Punkte von $C$.

  \item Die {\it Klasse\/} von $C\/$ (Ordnung der dualen Kurve von $C$), ist
\[ n(n-1) - \sum_{i_1,\ldots,i_k} \nu_{p_{i_j}}(C,\tilde{C}) \qquad p_{i_j}
\hbox{ Singularit"at von } C,\; (j=1 \ldots k) \;. \] 
\/$ \nu_{p_{i_j}}(C,\tilde{C}) \/$ ist die Schnittmultiplizit"at von $C\/$ und
$\tilde{C}\/$ im Punkt $p_{i_j}\/$ (vgl.~Def.~\ref{schnittmulti}).
  \item (Beispiel) Die Polare von $C\/$ relativ zu $(0,0,1)\/$ hat die Gleichung
\[ \Dp{F}{2}(x_0,x_1,x_2) = 0 \]
In der affinen Ebene entsprechend~:
\[ \frac{\partial f}{\partial y}(x,y) = 0 \]

Die affine Gleichung der Polaren beschreibt also eine Kurve, welche, geschnitten
mit $C$, diejenigen Punkte von $C\/$ liefert, die entweder singul"ar sind, oder
eine vertikale Tangente ($x = c ,\: c \in \C$)
besitzen. Dies trifft sogar auf eine ganze Kurvenfamilie $C_t\/$ mit affiner
Gleichung $f(x,y) = t\/$ zu.
\end{enumgjlett}
\end{bemerkung}
\bew{9.1}

\subsubsection{{\tt Polar}}
\begin{kopf}{Polar(F,pt,vars)}
  \pitem{F} Homogenes oder affines Polynom in drei resp.~zwei Variablen.
  \pitem{pt} Homogene oder affine Koordinaten.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Es wird die Polare von {\tt F} relativ zu {\tt pt} berechnet. Default f"ur
{\tt vars} ist {\tt getindets(F)}. 
\end{zweck}
\begin{algo}
Ist {\tt F} ein affines Polynom in zwei Variablen, so wird {\tt F}
homogenisiert.  Die Polare ergibt sich aus dem Skalarprodukt von {\tt pt} und
dem Gradienten von {\tt F}.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  POLAR  ______________________________________________________
  
  if affcase then
    hvars:= homvars;
    tmp:= dotprod(hompoint(pt,0),grad(hompoly(F,vars,hvars,0),hvars));
    RETURN ( affpoly(standard(tmp,hvars),hvars,vars,0) )
  else
    RETURN ( standard(dotprod(pt,grad(F,vars)),vars) )
  fi 
\end{verbatim}
\end{code}

\subsubsection{{\tt tangentthrupt}}
\begin{kopf}{tangentthrupt(F,pt,vars)}
  \pitem{F} Homogenes oder affines Polynom in drei resp.~zwei Variablen.
  \pitem{pt} Homogene oder affine Koordinaten.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Ist $C\/$ die durch die Gleichung {\tt F=0} bestimmte Kurve, dann wird eine Liste
aller Tangenten an die regul"aren Punkte von $C\/$ berechnet, die durch den Punkt
{\tt pt} gehen.
\end{zweck}
\begin{algo}
Ist {\tt F} nicht homogen, so werden {\tt F} und {\tt pt} homogenisiert. 
Mit {\tt Polar(F,pt,vars)} wird die Polare von {\tt F} relativ zu {\tt pt}
bestimmt, welche anschlie"send mit {\tt F} geschnitten wird. F"ur jeden
nicht-singul"aren Schnittpunkt wird die Tangente bestimmt.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  TANGENTTHRUPT  ____________________________________________________
  
  sel:= unapply('isregular'(F,t,vars),t);
  polsec := select(sel,intersection(F,Polar(F,pt,vars),vars));
  tmp:= NULL;
  for i from 1 to nops(polsec) do
    tmp:= tmp, tangent(F,polsec[i],vars)
  od;
  [tmp]
\end{verbatim}
\end{code}

\newpage
\section{Lineare Systeme von Kurven}

Die Menge aller homogenen Polynome vom Grad $m$, 
\[ \sum_{i_0+\cdots +i_k = m} a_{i_0\ldots i_k}x_0^{i_0} \cdots x_k^{i_k}\]
in den Unbestimmten $x_0,\ldots,x_k$, bilden einen komplexen Vektorraum der 
Dimension 
\[ N = { m+k \choose k} \;. \]
Betrachtet man zwei Polynome als "aquivalent, wenn sie sich nur durch einen
konstanten Faktor unterscheiden und somit die gleiche Kurve bestimmen,
dann bildet die Menge dieser "Aquivalenzklassen den komplexen projektiven
Raum $\PC{{N-1}}$, und die Koeffizienten $a_{i_0\ldots i_k}\/$ der homogenen
Polynome k"onnen als homogene Koordinaten in $\PC{{N-1}}\/$ aufgefa"st werden.
F"ur die projektive Ebene erh"alt man $N-1 = m(m+3)/2$.

\medskip 
Man betrachtet h"aufig projektive Teilr"aume $\PC{d}\/$ dieses Raumes und nennt
sie {\it lineare Subsysteme der Dimension d\/}. Eindimensionale Systeme werden
auch {\it B"uschel\/} von Kurven genannt. Von besonderem Interesse sind
Systeme, die durch eine bestimmte Anzahl von Punkten, durch welche die Kurven
laufen sollen, gegeben sind~:

Seien Kurven vom Grad $m\/$ durch Gleichungen $F(x_0,x_1,x_2)=0\/$ gegeben mit 
\[ F(x_0,x_1,x_2) = \sum_{i+j+k=m} a_{ijk}x_0^ix_1^jx_2^k \;.\]
Im Vektorraum aller solcher Polynome betrachtet man die $a_{ijk}\/$ als
Variablen. Sollen die Kurven nun durch einen bestimmten Punkt $c =
(c_0,c_1,c_2)\/$ gehen, so stellt dies in der Form
\[ F(c_0,c_1,c_2) = \sum_{i+j+k=m} a_{ijk}c_0^ic_1^jc_2^k = 0 \]
eine lineare Bedingung f"ur die Unbestimmten $a_{ijk}\/$ mit den komplexen
Zahlen $c_0^ic_1^jc_2^k\/$ als Koeffizienten dar.

Allgemeiner gilt~:  die Forderung, da"s eine Kurve $C\/$ im Punkt $p\/$ 
Multiplizit"at $\nu_p(C) \ge s\/$ hat, ist "aquivalent zu $s(s+1)/2\/$ linear
unabh"angigen Bedingungen. Dies ergibt sich aus der Tatsache, da"s alle
$(s-1)$--ten partiellen Ableitungen von $F\/$ an der Stelle $p\/$ Null sind.  Es
gibt $s(s+1)/2\/$ partielle Ableitungen der Ordnung $(s-1)$.  (Beweis
\cite[6.2]{BK}).

\pagebreak
\begin{satz}\\ 
Die Kurven der Ordnung $m$, welche zumindest die Multiplizit"aten $s_\rho\/$ in
den Punkten $p_\rho\/$ haben, bilden ein lineares System {$\cal L$} der
Dimension $d$, mit 
\[ d \ge \frac{m(m+3)}{2} - \sum_\rho \frac{s_\rho(s_\rho+1)}{2} \;.\]
\end{satz}
\bew{6.2.1}

Bemerkung~: ob Gleichheit oder Ungleichheit gilt, h"angt davon ab, ob die
Bedingungen f"ur die verschiedenen Punkte linear unabh"angig sind.

\bigskip
\begin{definition}\\
$r\/$ verschiedene Punkte $p_1,\ldots,p_r \in \PC{2}\/$ sind in {\it allgemeiner
Lage\/} relativ zu Kurven der Ordnung $m$, wenn das Linearsystem {$\cal L$} von
Kurven der Ordnung $m\/$ durch $p_1,\ldots,p_r\/$ die kleinste m"ogliche Dimension
hat, d.h.~wenn
\[ d = \frac{m(m+3)}{2} - r \;.\]
\end{definition}

\medskip 

In \name\ ist eine Prozedur vorhanden, die solche Linearsysteme bestimmen
kann. Diese Prozedur ist in gewissem Sinne von zentraler Bedeutung, k"onnen
doch beispielsweise die Singularit"aten von Kurven einer bestimmten Ordnung auf
ganzzahlige Koordinatentupel gesetzt werden, was die Anwendbarkeit vieler
Prozeduren im Sinne der Vermeidung von {\tt RootOf}--Ausdr"ucken erh"oht.

\subsubsection{{\tt linearsystem}}
\begin{kopf}{linearsystem(ptlist,m,vars)}
  \pitem{ptlist} Liste mit homogenen Koordinaten aus $\PC{2}\/$ oder Paaren,
bestehend aus einer homogenen Koordinate und der Multiplizit"at.
  \pitem{m} Geforderter Grad der Kurven.
  \pitem{vars} Homogene Polynomvariablen \opt.
\end{kopf}
\begin{zweck} 
Es wird eine Basis von homogenen Polynomen $F_0,\ldots,F_d\/$ f"ur den
$(d+1)$--dimensionalen Vektorraum von homogenen Polynomen des Grads {\tt m}
berechnet, dessen Kurven durch die in {\tt ptlist} angegebenen Punkte mit den
entsprechenden Multiplizit"aten gehen. Default-Multiplizit"at ist 1. Das
Resultat ist eine Liste von Polynomen. Default f"ur {\tt vars} ist {\tt
homvars}. 
\end{zweck}

\begin{algo}
Das Vorgehen sei am Beispiel von Kurven mit Grad $n$, die durch die Punkte $c
= (c_0,c_1,c_2)\/$ und $d = (d_0,d_1,d_2)\/$ gehen sollen, erl"autert. Bezeichnen
$a_{i,j,k}\/$ die Koeffizienten von $x_0^ix_1^jx_2^k\/$ f"ur alle $i,j,k\/$ mit
$i+j+k=n$, so erh"alt man folgendes lineares Gleichungssystem~:
\[ \underbrace {\left(
\begin{array}{l@{\;\ldots\;}l}
 c_0^nc_1^0c_2^0 & c_0^0c_1^0c_2^n \\[0.5ex]
 d_0^nd_1^0d_2^0 & d_0^0d_1^0d_2^n
\end{array}  \right) }_{\textstyle A} \cdot
\myvec{ a_{n,0,0}\\ \vdots \\ a_{0,0,n}} = \myvec{0\\0}   \]

Sind die Multiplizit"aten gr"o"ser als 1, m"ussen die jeweils $(s-1)$--ten
Ableitungen der $x_0^ix_1^jx_2^k\/$ bestimmt werden. In diese setzt man die
Punktwerte $(c_0,c_1,c_2)\/$ ein und erg"anzt damit die Matrix $A\/$ um jeweils
eine Zeile.

Es ist somit eine Basis des Nullraumes von $A\/$ gesucht, d.h.~eine Basis des
Vektorraumes, f"ur dessen Elemente $\vec{b}$, $A\vec{b} = \vec{0}\/$ gilt.
Eine solche Basis erh"alt man mit der Funktion {\tt nullspace(A)} aus {\tt
linalg}. Die erhaltenen Basisvektoren (Koeffiziententupel der gesuchten
Basispolynome) werden anschlie"send mit der Prozedur {\tt coord2poly}  zu
Polynomen umgewandelt.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  LINEARSYSTEM ______________________________________________________
  
processmult:= proc (pts,mult,unity,vars)
local lunity, s,len,tmp, i,j,k;
  len:= nops(pts);
  if mult = 1 then 
    RETURN([seq(appoly0(unity,pts[i],vars),i=1..len)])
  fi;  
  s:= mult-1;
  tmp:= NULL;
  for i from 0 to s do
    for j from 0 to s-i do
      lunity:= map(diff,unity,vars[1]$i,vars[2]$j,vars[3]$(s-i-j));
      tmp:= tmp,seq(appoly0(lunity,pts[k],vars),k=1..len)
    od
  od;
  [tmp]
end:  

  ...
  unity:= unityvec(m,vars);
  rowseq:= NULL;
  restlist:= pts;
  while restlist <> [] do
    ptsofmult:= filter(restlist,'restlist','mult');
    rowseq:= rowseq,op(processmult(ptsofmult,mult,unity,vars))
  od;
  A:= linalg['matrix']([rowseq]);
  nspace:= map(convert,convert( nullspace(A) ,list),list);
  map(coord2poly,nspace,vars)
\end{verbatim}
\end{code}


\subsubsection{{\tt randsyspoly}}
\begin{kopf}{randsyspoly(L)}
  \pitem{L} Liste von Polynomen.
\end{kopf}
\begin{zweck}
Es wird eine zuf"allige Summe der Polynome aus {\tt L} bestimmt. Die
Zufallskoeffizienten stammen aus $\{-1,0,1\}$. Die Funktion ist ein didaktisches
Hilfsmittel, um aus den meist reduziblen Polynomen im Resultat von {\tt
linearsystem} ein (im allgemeinen) irreduzibles Polynom mit den gleichen
Eigenschaften zu erhalten.
\end{zweck}

\begin{code}
\begin{verbatim}
# ___  RANDSYSPOLY  ______________________________________________________

  r:= rand(-1..1);
  convert( [ seq( r()*L[i], i=1..nops(L) ) ], `+`)  
\end{verbatim}
\end{code}

\begin{beispiel}\\
Es soll ein Linearsystem von Kurven 3.~Grades erzeugt werden, die durch die
Punkte $v_1=(1,0,0)$, $v_2=(1,1,1)\/$ und $v_3=(1,0,1)\/$ laufen, wobei
$v_2\/$ ein singul"arer Punkt mit Multiplizit"at 2 sein soll. Ein
Beispielpolynom aus diesem Linearsystem soll in die affine Ebene projiziert
werden.

Die Aufgabe kann in folgender Weise gel"ost werden (es wird nur das Resultat
des letzten Aufrufs angegeben)~:
\begin{quote}
  \begin{verbatim}
> v1:= [1,0,0]: 
> v2:= [1,1,1]: 
> v3:= [1,0,1]:

> pts:= [ v1, [v2,2], v3 ]:
> L:= linearsystem(pts, 3):

> F:= randsyspoly(L):
> f:= affpoly(F);
                             3      2      2    3
   f := - 2 x + y + 4 x y - y  - x y  - 2 x  + x
  \end{verbatim} 
\end{quote}
\end{beispiel}


% Master File: algcurve.tex

\section{Schnittpunkte und Wendepunkte}

\subsection{Schnitt zweier Kurven}

\begin{satz}\\
Zwei Kurven der Ordnung $m\/$ resp.~$n\/$ ohne gemeinsame Komponente haben in
der komplexen projektiven Ebene h"ochstens $mn\/$ Schnittpunkte.
\end{satz}
\bew{6.1.1}


\begin{definition}
\mylabel{schnittmulti}\\ 
Seien $C\/$ und $C'\/$ zwei Kurven in der komplexen projektiven Ebene ohne
gemeinsame Komponenten, und $p_i\/$ die Schnittpunkte von $C\/$ und $C'$.
Seien ferner $(x_0,x_1,x_2)\/$ Koordinaten, soda"s der Punkt $(0,0,1)\/$ auf
keiner Verbindungsgeraden zweier Schnittpunkte liegt.  Seien
$F(x_0,x_1,x_2)=0\/$ und $G(x_0,x_1,x_2)=0\/$ die Gleichungen von $C\/$
resp.~$C'\/$ bez"uglich dieser Koordinaten. Sei $R_{F,G}(x_0,x_1)\/$ die
Resultante von $F\/$ und $G\/$ bez"uglich $x_2\/$ ($F$, $G\/$ als Polynome in
$x_2\/$ mit Koeffizienten aus $\C[x_0,x_1]$ aufgefa"st).  Sei $p_i =
({c_0}_i,{c_1}_i,{c_2}_i)\/$ und $c_i = ({c_0}_i,{c_1}_i)$. Dann ist die {\it
Schnittmultiplizit"at\/} $\:\nu_{p_i}(C,C')\:\/$ von $C\/$ und $C'\/$ in
$p_i\/$ definiert als Vielfachheit der Nullstelle $c_i\/$ von $R_{F,G}$.
\end{definition}


\begin{theorem} (Theorem von B\'ezout)\\ 
Seien $C\/$ und $C'\/$ zwei Kurven ohne gemeinsame Komponente in der komplexen
projektiven Ebene mit Ordnung $m\/$ resp.~$n$. Dann gilt f"ur die Summe der
Schnittmultiplizit"aten von $C\/$ und $C'$~:
\[ \sum_{p \in C \cap C'} \nu_p(C,C') \;=\; mn \]
\end{theorem}
\bew{6.1.2}

\begin{lemma}\\
Die Schnittmultiplizit"at $\nu_p(C,C')\/$ h"angt nicht von der Wahl des
Koordinatensystems in der projektiven Ebene ab.
\end{lemma}
\bew{6.1.3}

\begin{satz}\\
Seien $C\/$ und $C'\/$ Kurven ohne gemeinsame Komponente und $p\/$ ein
Schnittpunkt von $C\/$ und $C'$. Dann gilt~:
\begin{enumgjlett}
  \item $\nu_p(C,C')\ge \nu_p(C) \nu_p(C')$ 
  \item $\nu_p(C,C') = \nu_p(C) \nu_p(C')\/$ genau dann, wenn die Tangenten an
$C\/$ in $p\/$ paarweise verschieden von den Tangenten an $C'\/$ in $p\/$
sind.
\end{enumgjlett}
\end{satz}
\bew{6.1.3}

\begin{satz}\\ 
Seien $f(x,y)\/$ und $g(x,y)\/$ zwei Polynome aus $\C[x,y]\/$ ohne gemeinsame
Punkte aus $\{ (0,y) \in \C^2 \} \backslash \{(0,0)\}\/$ (keine Schnittpunkte
auf der $y$-Achse mit Ausnahme des Ursprungs). Ferner sei $R(x)\/$ die
Resultante von $f\/$ und $g\/$ bez"uglich $y$. Dann ist die
Schnittmultiplizit"at von $f\/$ und $g$ im Ursprung gleich der Vielfachheit
der Nullstelle 0 von $R(x)$.
\end{satz}
\begin{beweis} \cite[IV.5.2]{Wa} \end{beweis}



\subsubsection{{\tt intersection}}
\begin{kopf}{intersection(F,G,vars)}
  \pitem{F,G} Homogene oder affine Polynome ohne gemeinsame Komponente.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Es wird eine Liste der gemeinsamen Schnittpunkte von {\tt F} und {\tt G}
erstellt. Default f"ur {\tt vars} ist {\tt getindets([F,G])}.
\end{zweck}

\begin{algo}
Die Schnittpunkte werden mit {\tt solve} f"ur die Variablen in {\tt vars}
bestimmt. Sind {\tt F} und {\tt G} homogene Polynome, so werden die Koordinaten
der Schnittpunkte mit {\tt standard} vereinfacht.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  INTERSECTION  _____________________________________________________
  
  sols:= {solve({F,G},convert(vars,set))};
  sols:= convert( { seq(subs(sols[i],vars),i=1..nops(sols)) }, list);
  homcase:= evalb( nops(vars) = 3  and type(F,projpoly(vars) ));
  if homcase then
    sel:= unapply( 'evalb(not iszerolist(t))',t );
    sols:= select(sel,sols);
    RETURN (map(standard,sols))
  else
    RETURN (eval(sols))        
  fi  
\end{verbatim}
\end{code}


\subsubsection{{\tt intermultiplicity}}
\begin{kopf}{intermultiplicity(F,G,intpts,vars)}
  \pitem{F,G} Polynome in 2 oder 3 Variablen.
  \pitem{intpts} Einzelner Punkt oder Liste von Punkten.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Es wird die Liste der Schnittmultiplizit"aten der Schnittpunkte aus {\tt
int\-pts} bestimmt (in der durch {\tt intpts} festgelegten Reihenfolge). 
Default f"ur {\tt vars} ist {\tt getindets([F,G])}.
\end{zweck}

\begin{algo}
Sei $P\/$ ein gemeinsamer Schnittpunkt. $F$, $G\/$ und $P\/$ werden
in eine geeignete Koordinatenumgebung projiziert. Die assoziierten Polynome
seien dann $f\/$ und $g\/$ und  $P\/$ habe die affinen Koordinaten
$(a,b)$. Durch die Translation $(x,y) \mapsto (x+a,y+b)\/$ wird $P\/$ 
in den Ursprung verschoben. Man erh"alt also zwei Polynome
\begin{eqnarray*}
  \tilde{f}(x,y) & := & f(x+a,y+b) \\
  \tilde{g}(x,y) & := & g(x+a,y+b) 
\end{eqnarray*}
mit gemeinsamem Schnittpunkt in $(0,0)$. Das Koordinatensystem wird nun solange
gedreht, bis  $\tilde{f}\/$ und $\tilde{g}\/$ auf der $y$-Achse keine 
weiteren Schnittpunkte besitzen. Die Drehungen erfolgen mit den orthogonalen
Abbildungen
\[ \left( \begin{array}{rr}
     k & 1 \\ -1 & k
   \end{array} \right) \quad  k \in \N \;.  \]
Die transformierten Polynome haben entsprechend die Gestalt
\begin{eqnarray*}
  \tilde{f}_k(x,y) & := & \tilde{f}(kx+y,-x+ky) \\
  \tilde{g}_k(x,y) & := & \tilde{g}(kx+y,-x+ky) 
\end{eqnarray*}
$\tilde{f}_k\/$ und $\tilde{g}_k\/$ besitzen genau dann einen gemeinsamen
Schnittpunkt mit der $y$-Achse wenn die Resultante
\[R_{\tilde{f}_k(0,y),\tilde{g}_k(0,y)}\] 
verschwindet. Da $y=0\/$ gemeinsame Nullstelle ist, m"ussen $\tilde{f}_k(0,y)$
und $\tilde{g}_k(0,y)\/$ vor der Resultantenbildung durch die h"ochstm"ogliche
Potenz von $y\/$ dividiert werden.  Ist die Resultante dann verschieden von 0,
existieren keine weiteren gemeinsame Nullstellen und man erh"alt die
Schnittmultiplizit"at als kleinsten Grad von $x\/$ in der Resultante von
$\tilde{f}_k(x,y)\/$ und $\tilde{g}_k(x,y)\/$ bez"uglich $y$. Da $F\/$ und
$G\/$ keine gemeinsame Komponente haben, gibt es nach dem Satz von B\'ezout
nur endlich viele Schnittpunkte, und $\tilde{f}_k\/$ und $\tilde{g}_k\/$
k"onnen nur f"ur endlich viele Werte von $k \in \N\/$ einen weiteren
Schnittpunkt auf der $y$-Achse besitzen.
\end{algo}

\pagebreak
\begin{code}
\begin{verbatim}
# ___  INTERMULTIPLICITY  ________________________________________________

intermultiplicity0 := proc (f,g,pt,vars)
local lf,lg,k,fk,gk,fk0,gk0,v,R;
  v:= [vars[1]=vars[1]+pt[1], vars[2]=vars[2]+pt[2]];
  lf:= subs(v,f); 
  lg:= subs(v,g);
  v:=[];
  fk0:= subs(vars[1]=0,lf);  
  gk0:= subs(vars[1]=0,lg);
  fk0:= fk0/vars[2]^ldegree(fk0,vars[2]);
  gk0:= gk0/vars[2]^ldegree(gk0,vars[2]);
  R:= resultant(fk0,gk0,vars[2]);
  for k from 0 while R = 0 do
    v:= [vars[1]=k*vars[1]+vars[2], vars[2]=-vars[1]+ k*vars[2]];
    fk0:= subs(v,vars[1]=0,lf); 
    gk0:= subs(v,vars[1]=0,lg);
    fk0:= fk0/vars[2]^ldegree(fk0,vars[2]);
    gk0:= gk0/vars[2]^ldegree(gk0,vars[2]);
    R:= resultant(fk0,gk0,vars[2]);
  od;
  fk:= subs(v,lf); 
  gk:= subs(v,lg);
  R:= resultant(fk,gk,vars[2]);
  ldegree(R,vars[1])
end:  
\end{verbatim}
\end{code}


\subsection {Wendepunkte}

\begin{definition}\\
Ein regul"arer Punkt $p\/$ einer Kurve $C\/$ in der komplexen projektiven
Ebene ist ein {\it Wendepunkt} von $C$, wenn die Tangente $T\/$ an $C\/$ in
$p\/$ keine Komponente von $C\/$ ist und $C\/$ in $p\/$ mit Multiplizit"at
$\nu_p(C,T) \ge 3$ schneidet.  $p\/$ hei"st {\it $r$-facher Wendepunkt\/}
falls f"ur die Schnittmultiplizit"at $\nu_p(C,T) = r+2\/$ gilt. Ist die
Tangente $T\/$ Komponente von $C$, dann hei"st $p\/$ {\it uneigentlicher
Wendepunkt\/}.
\end{definition}

\begin{definition}\\
Sei $C\/$ eine Kurve in der komplexen projektiven Ebene, welche nicht
vollst"andig in Geraden zerf"allt und $F(x_0,x_1,x_2) = 0\/$ ihre Gleichung.
Dann hei"st die Kurve $H_C\/$ mit Gleichung
\[ \left|\left(\frac{\partial^2 F}{\partial x_i \partial x_j}\right)\right| =
0 \] 
die {\it Hessesche Kurve\/} von $C$.  $\left(\partial^2 F/(\partial
x_i \partial x_j)\right)\/$ hei"st {\it Hessesche Matrix\/}.
\end{definition}

\begin{bemerkung}
\mylabel{Hessian}
\begin{enumgjlett}
  \item Die Hessesche Matrix verschwindet identisch genau dann, wenn $C\/$ in
Geraden zerf"allt.
  \item $H_C\/$ ist unabh"angig von der Koordinatenwahl, da sich die Hessesche
Matrix unter Koordinatentransformation wie eine quadratische Form verh"alt.
  \item Die Hessesche Kurve $H_C\/$ einer Kurve $C\/$ der Ordnung $m\/$ hat Grad
$3(m-2)$. Insbesondere ist die Hessesche Kurve einer Kubik wieder eine Kubik.
  \item F"ur eine Quadrik $C\/$ ist $H_C\/$ leer.
  \item $H_C\/$ geht durch jeden singul"aren Punkt $p\/$ von $C$.
\end{enumgjlett}
\medskip
(vgl.~\cite[7.3]{BK}
\end{bemerkung}

\begin{satz}\\
Sei $C\/$ eine ebene Kurve ohne Geraden als Komponenten. Dann ist ein
regul"arer Punkt $p\/$ von $C\/$ ein $r$-facher Wendepunkt von $C\/$ genau
wenn die Hessesche Kurve $H_C\/$ die Kurve $C\/$ in $p\/$ mit Multiplizit"at
$r\/$ schneidet.
\end{satz}
\bew{7.3.1}

\begin{korollar}\\
Eine nicht-singul"are Kurve der Ordnung $m \ge 2\/$ in der komplexen projektiven
Ebene hat, mit Multiplizit"at gez"ahlt, genau $3m(m-2)\/$ Wendepunkte. 
\end{korollar}
\bew{7.3.2}

\begin{korollar}\\
Eine nicht-singul"are Kubik hat genau neun verschiedene Wendepunkte, und diese
sind ausschlie"slich einfache Wendepunkte.
\end{korollar}
\bew{7.3.3}


\subsubsection{{\tt Hessian}}
\begin{kopf}{Hessian(F,vars)}
  \pitem{F} Homogenes oder affines Polynom in 3 resp.~2 Variablen.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\pagebreak
\begin{zweck}
Es wird die Hessesche Kurve von {\tt F} bestimmt. Ist {\tt F} ein affines
Polynom in zwei Variablen, so wird das assoziierte Polynom der Hesseschen
Kurve zur"uckgegeben.
\end{zweck}
\begin{algo}
Ist {\tt F} ein affines Polynom in zwei Variablen, so wird {\tt F} zuerst
homogenisiert.  Mit Hilfe der Funktionen {\tt linalg[hessian]} und {\tt
linalg[det]} wird die Determinante der Hesseschen Matrix bestimmt.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  HESSIAN  __________________________________________________

  res:= standard(det(hessian(lF,hvars)),hvars);
  if affcase then
    affpoly(res,hvars,vars,0)
  else
    eval(res)
  fi
\end{verbatim}
\end{code}


\subsubsection{{\tt inflections}}
\begin{kopf}{inflections(F,vars)}
  \pitem{F} Homogenes oder affines Polynom in 3 resp.~2 Variablen.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}

\begin{zweck}
Es wird eine Liste der Wendepunkte der durch {\tt F} bestimmten Kurve erstellt
(enth"alt u.U.~auch uneigentliche Wendepunkte). Default f"ur {\tt vars} ist
{\tt getindets(F)}.
\end{zweck}

\begin{algo}
 Mit {\tt intersection} wird die
Liste der Schnittpunkte der Kurve mit ihrer Hesseschen Kurve erzeugt. Das
Resultat ist die Liste der regul"aren Schnittpunkte.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  INFLECTIONS  __________________________________________________

  sols:= intersection(F,Hessian(F,vars),vars);
  homcase:= evalb( nops(vars) = 3  and type(F,projpoly(vars) ));
  sel:= unapply('isregular'(F,t,vars),t);
  if homcase then
    map(standard,select(sel,sols))
  else
    select(sel,sols)     
  fi  
\end{verbatim}
\end{code}


\subsection {{\tt RootOf}--Ausdr"ucke}

\subsubsection{{\tt tryall}}
\begin{kopf}{tryall(L,opt1,opt2)}
  \pitem{L} Liste von Polynomen oder Liste von Koordinaten.
  \pitem{opt1} Option {\tt 'd'} oder {\tt 'simplified'} \opt.
  \pitem{opt2} Option {\tt 'd'} oder {\tt 'simplified'} \opt.
\end{kopf}
\begin{zweck}
Es sollen, soweit m"oglich, alle {\tt RootOf}--Ausdr"ucke in den Elementen von
{\tt L} aufgel"ost werden. Jeder mit {\tt solve} l"osbare {\tt
RootOf}--Ausdruck wird eliminiert. Resultat ist die Liste {\tt L}, wobei die
Elemente mit l"osbaren {\tt RootOf}--Ausdr"ucken ersetzt sind durch alle
m"oglichen Substitutionen der Ausdr"ucke durch ihre L"osungen. Auf diese Weise
k"onnen alle {\tt RootOf}--Ausdr"ucke bis zum Grad 4 exakt aufgel"ost werden.
Die Option {\tt 'd'} entspricht der Option {\tt 'd'} von {\tt allvalues},
d.h.~gleiche {\tt RootOf}--Ausdr"ucke in einer Gleichung werden als
Repr"asentanten desselben Wertes aufgefa"st und werden nicht unabh"angig
voneinander ersetzt. Mit der Option {\tt `simplified'} kann gefordert werden,
da"s alle L"osungen mit {\tt simplify} vereinfacht werden sollen.
\end{zweck}

\begin{algo}
Es wird im wesentlichen die Funktion {\tt allvalues} verwendet. Im Gegensatz
zu {\tt allvalues} werden aber nicht-aufl"osbare {\tt RootOf}--Ausdr"ucke
nicht ersetzt, d.h.~es findet keine numerische Wurzelbestimmung (mit {\tt
fsolve}) statt.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  TRYALL  __________________________________________________________
  
  if optd then
    sols:= {seq(allvalues(lL[i],'d'),i=1..nops(lL))}
  else
    sols:= {seq(allvalues(lL[i]),i=1..nops(lL))}
  fi;
  if optsimpl then sols:= map(simplify,sols) fi;
\end{verbatim}
\end{code}
 

% Document Type: LaTeX
% Master File: algcurve.tex

\section{Rationale Funktionen}

\begin{definition}\\
Eine irreduzible Kurve $C\/$ mit affiner Gleichung $f(x,y)=0\/$ hei"st {\it
rational\/}, wenn es zwei rationale Funktionen $\phi(\lambda),\psi(\lambda) \in
\C(\lambda)\/$ gibt, soda"s 
\begin{enumgjlett}
  \item F"ur alle bis auf endlich viele $\lambda_0 \in \C\/$ ist 
$(\phi(\lambda),\psi(\lambda))\/$ ein Punkt von $C$.
  \item Bis auf eine endliche Zahl von Ausnahmen gibt es f"ur jeden Punkt
$(x_0,y_0)\/$ von $C\/$ ein eindeutiges $\lambda_0 \in \C$, soda"s $x_0 =
\phi(\lambda_0)$, $y_0 = \psi(\lambda_0)$.
\end{enumgjlett}
\end{definition}

\begin{satz}
\mylabel{explsatz}\\
Eine irreduzible Kurve $C\/$ der Ordnung $n\/$ ist rational, falls
\[ (n-1)(n-2) = \sum r_i(r_i-1)\]
($r_i\/$ seien die Multiplizit"aten der singul"aren Punkte von $C$).
\end{satz}

\begin{beweis}\\ 
Man betrachte das lineare System $\cal{L}\/$ von Kurven der Ordnung $n-1$, die
durch jeden $r_i$-fachen Punkt von $C\/$ mit Multiplizit"at $(r_i-1)\/$ und
$2n-3$ zus"atzliche einfache Punkte von $C\/$ laufen. Die Dimension $R\/$
dieses Systems ist

\[ R \ge \frac{(n-1)(n+2)}{2} - \underbrace{\frac{\sum
r_i(r_i-1)}{2}}_{\textstyle (n-1)(n-2)/2} - (2n-3) = 1 \;.\]

Annahme $R > 1$~: Dann gibt es eine Kurve $g\/$ dieses Systems, die zwei
weitere Punkte von $C\/$ enth"alt. Folglich haben aber $f\/$ und $g\/$ eine
gemeinsame Komponente, da

\[ \sum r_i(r_i-1) + (2n-3) + 2 > n(n-1) \;. \]

Dies ist unm"oglich, da $f\/$ irreduzibel ist, und $g\/$ einen kleineren
Grad hat als $f$. Also ist $R = 1$. Mit einer Ausnahme k"onnen die Kurven von
$\cal{L}\/$ also in der Form $g_1 + \lambda g_2\/$ mit geeignetem $\lambda$
ausgedr"uckt werden. Man w"ahlt nun affine Koordinaten so, da"s 
\[ \begin{array}{lll}
 f & = & ay^n + \cdots \\
 g_1 & = & by^{n-1} + \cdots \\
 g_2 & = & cy^{n-1} + \cdots \\
  \end{array}  \qquad a,b,c \neq 0  \]

und so, da"s keine Schnittpunkte von $f\/$ und $g_1\/$ im Unendlichen liegen
(d.h.~im besonderen, da"s die Singularit"aten und die Zusatzst"utzpunkte von
$\cal{L}\/$ im Endlichen liegen). Sei $R(x,\lambda)\/$ die Resultante von
$f\/$ und $g_1 + \lambda g_2$. Man erh"alt

\[ R(x,\lambda) = b_0(\lambda) + b_1(\lambda)x + \cdots + b_N(\lambda)x^N \]

mit $N = n(n-1)$. Da $R(x,0)\/$ die Resultante von $f\/$ und $g_1\/$ ist mit
Grad $n(n-1)$, ist $b_N(0) \neq 0$, und somit verschwindet $b_N(\lambda_0)$
h"ochstens f"ur eine endliche Menge von Werten $\lambda_0$.  Man schlie"st
diese Werte f"ur die weitere Betrachtung aus. Somit haben $f\/$ und $g_1 +
\lambda_0 g_2\/$ keine Schnittpunkte im Unendlichen. Bei jedem $r_i$-fachen
Punkt $(a_i,b_i)\/$ von $f\/$ hat $R(x,\lambda_0)\/$ eine Wurzel $a_i\/$ mit
Multiplizit"at zumindest $r_i(r_i-1)$, und bei jedem der $2n-3\/$ gew"ahlten
einfachen Punkten $(c_j,d_j)\/$ von $f\/$ hat $R(x,\lambda_0)\/$ eine einfache
Wurzel $c_j\/$ . Da

\[ \sum r_i(r_i-1) + 2n -3 = n(n-1) - 1 \]

kennt man bis auf eine Ausnahme alle Wurzeln von $R(x,\lambda_0) = 0$. Nach
dem Satz von Vieta ist die verbleibende Wurzel

\[ \phi(\lambda_0) = -\frac{b_{N-1}(\lambda_0)}{b_N(\lambda_0)} - \sum
r_i(r_i-1)a_i - \sum c_j \;.\]

Man erh"alt hierdurch eine bestimmte rationale Funktion $\phi(\lambda_0)$.
Analog verf"ahrt man mit der Resultanten bez"uglich $x$, und erh"alt die
Funktion $\psi(\lambda)$. Diese Funktionen erf"ullen die Eigenschaften der
Definition rationaler Funktionen~:
\begin{enumgjlett}
  \item F"ur jeden der nicht-ausgeschlossenen Werte von $\lambda_0\/$ gilt nach
Konstruktion von $\phi(\lambda_0)\/$ und $\psi(\lambda_0)$, da"s
$(\phi(\lambda_0),\psi(\lambda_0))\/$ ein Punkt von $C\/$ ist.  
  \item Ist $(x_0,y_0)\/$ ein Punkt von $f\/$ nicht auf $g_2$, so gibt es ein
eindeutig bestimmtes $\lambda_0$, soda"s $(x_0,y_0)\/$ Nullstelle von $g_1 +
\lambda g_2$, n"amlich $\lambda_0 = -g_1(x_0,y_0)/g_2(x_0,y_0)$. Also ist
$x_0\/$ eine Wurzel von $R(x,\lambda_0)$, und so ist $x_0 = \phi(\lambda_0)$.
Analog erh"alt man $y_0 = \phi(\lambda_0)$. Da nur eine endliche Menge von
Punkten von $f\/$ auf $g_2\/$ liegen, ist der Beweis erbracht.
\end{enumgjlett}
\medskip
vgl.~\cite[III.5.1]{Wa}
\end{beweis}

\begin{bemerkung}
\mylabel{explbem}
\begin{enumgjlett}
  \item F"ur eine Kurve der Ordnung $n\/$ mit einem $(n-1)$-fachen Punkte
$(a,b)\/$ k"onnen die Kurven $g_1+\lambda g_2 = 0 \/$ im Beweis durch die Geraden
\[ (y-b) - \lambda (x-a) = 0 \]
ersetzt werden. 
  \item F"ur $n > 2\/$ k"onnen Kurven der Ordnung $n-2\/$ mit einem
$(r_i-1)$-fachen Punkt in jedem $r_i$-fachen Punkt von $f\/$ gew"ahlt werden,
die durch $n-3\/$ zus"atzliche einfache Punkte von $f\/$ gehen.
  \item In projektiven Koordinaten ausgedr"uckt ist die Bedingung f"ur die
Rationalit"at einer irreduziblen Kurve $F\/$ die Existenz dreier homogener
Polynome $G_i(\lambda,\mu)$, $i=0,1,2$, vom gleichen Grad, soda"s
\begin{enumerate}
  \item $(G_0(\lambda_0,\mu_0),\-G_1(\lambda_0,\mu_0),\-G_2(\lambda_0,\mu_0))$
ist bis auf eine endliche Menge von Ver\-h"alt\-nis\-sen $(\lambda_0:\mu_0)\/$
ein Punkt von $F$.  
  \item Bis auf endlich viele Ausnahmen, gibt es zu jedem Punkt $(a_0, a_1,
a_2)\/$ von $F\/$ ein eindeutig bestimmtes Verh"altnis $(\lambda_0:\mu_0)$,
soda"s $\rho a_i = G_i(\lambda_0,\mu_0)\/$ mit $\rho \neq 0$.
\end{enumerate}
\end{enumgjlett}
\end{bemerkung}


\subsection {Implizite und explizite Darstellung}

\subsubsection{{\tt explicit}}
\begin{kopf}{explicit(F,vars,var,invfun)}
  \pitem{F} Homogenes oder affines Polynom in 3 resp.~2 Variablen.
  \pitem{vars} Polynomvariablen \opt.
  \pitem{var} Variable der rationalen Funktionen \opt.
  \pitem{invfun} Name f"ur die Umkehrfunktion \opt.
\end{kopf}
\begin{zweck}
Sei $C\/$ die durch {\tt F} bestimmte Kurve. $C\/$ mu"s irreduzibel sein, und
f"ur die Multiplizit"aten mu"s gelten, da"s
\[ (n-1)(n-2) = \sum r_i(r_i-1) \] 
Dann wird im affinen Fall ein Paar $(x(t),y(t))\/$ von rationalen Funktionen aus
$\C(t)\/$ und im homogenen Fall ein Tripel $(x_0(t),x_1(t),x_2(t))\/$ von
Polynomen aus $\C[t]\/$ berechnet. Dem Bezeichner {\tt invfun} wird die
zugeh"orige Umkehrfunktion zugewiesen, d.h.~diejenige rationale Funktion, die
f"ur jeden Kurvenpunkt $(x_0,y_0) \in C\/$ (bis auf endlich viele Ausnahmen) den
entsprechenden Parameterwert $t_0\/$ bestimmt (d.h.~$(x(t_0),y(t_0)) =
(x_0,y_0)$). Default f"ur {\tt vars} ist {\tt getindets(F)} und f"ur {\tt var}
{\tt explvar}.
\end{zweck}

\begin{algo}
Ist {\tt F} ein affines Polynom so wird {\tt F} bzgl.~$U_0\/$ homogenisiert.
Die Singularit"aten werden mit {\tt singularities} und die Multiplizit"aten
$r_i\/$ mit {\tt multiplicity} bestimmt. Der Algorithmus folgt im wesentlichen
dem Beweis von Satz \ref{explsatz} . Falls m"oglich werden die Bemerkungen
\ref{explbem} a) und \ref{explbem} b) ausgen"utzt.  Seien $g_1\/$ und $g_2\/$
die Polynome des Linearsystems aus dem Beweis und $G_1\/$ resp.~$G_2\/$ die
assoziierten homogenen Polynome.  Ist $(a_0,a_1,a_2)\/$ ein $(n-1)$-facher
Punkt von $C\/$, dann wird eine Koordinatenumgebung $U_i\/$ mit $a_i \neq 0\/$
gew"ahlt und nach Bemerkung \ref{explbem} a) $G = G_1 + tG_2\/$ festgelegt~:
ist z.B.~$a_0 \neq 0$, so setzt man $G_1 := x_2 - (a_2/a_0)x_0\/$ und $G_2 :=
x_1 - (a_1/a_0)x_0$.  Falls der Grad $n\/$ von $F\/$ gr"o"ser als 2 ist, wird
die Bestimmung des Linearsystems gem"a"s Bemerkung \ref{explbem} b)
erleichtert.  Ist Fall \ref{explbem} a) nicht eingetreten, so wird mit {\tt
linearsystem} das Linearsystem den Singularit"aten entsprechend bestimmt,
wobei mit {\tt RegCurvePts} die zus"atzlichen einfachen Punkte von $C\/$ durch
Schnitt von $C$ mit Geraden bestimmt werden. Dadurch sind $G_1$, $G_2\/$ und
$G\/$ bestimmt. $F$ und $G\/$ besitzen nach B\'ezout, mit Multiplizit"at
gez"ahlt, $n(n-1)$ Schnittpunkte, wovon nach Konstruktion des Linearsystems
$n(n-1)-1\/$ bekannt sind. Die Punkte von $F$, welche auch auf $G_2\/$ liegen,
sind von der folgenden Betrachtung ausgeschlossen (davon gibt es nur endlich
viele, da $F$ irreduzibel ist und $G_2\/$ kleineren Grad als $F\/$ hat).  Sei
nun $P=(p_0,p_1,p_2)\/$ der verbleibende Schnittpunkt. Es mu"s gelten~:

\[ F(P) = G(P) = G_1(P) + tG_2(P) = 0 \] 
Da nach Voraussetzung $G_2(P) \neq 0\/$ ist
ist $t\/$ durch \[ -\frac{G_1(P)}{G_2(P)} \] 

eindeutig bestimmt. Da nur endlich viele Punkte im Unendlichen liegen k"onnen,
gibt es zu diesen Punkten auch nur endlich viele eindeutig bestimmte
Parameterwerte $t_0$. Diese seien von der Betrachtung ausgeschlossen. So kann
auf die Bedingung, da"s kein Schnittpunkt von $F\/$ und $G_1\/$ im Unendlichen
liegen darf, verzichtet werden. Durch "Ubergang zu affinen Koordinaten gelangt
man zur Konstruktion des Beweises von Satz \ref{explsatz} zur"uck.  Sind
$\phi\/$ und $\psi\/$ die dem Beweis entsprechend bestimmten Funktionen, so
mu"s im homogenen Fall das Tupel $(1,\phi(t),\psi(t))\/$ mit dem Produkt der
Nenner von $\phi\/$ und $\psi\/$ multipliziert zu werden (Anwendung von {\tt
standard}) und man erh"alt die drei Polynome $(x_0(t),x_1(t),x_2(t))$. Die
Polynome $x_i(t)$ k"onnen als $G_i(1,t)\/$ aus Bemerkung \ref{explbem} c)
aufgefa"st werden.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  EXPLICIT  ________________________________________________________

  if n = 2 then  
    nrofextra:=   1; nL:= 1  
  else  
    nrofextra:= n-3; nL:= n-2 
  fi;
  extrapts:= RegCurvePts(F,nrofextra,hvars);
  if nops(extrapts) < nrofextra then RETURN(FAIL) fi;
  Lpts:=  [ seq([spts[i],r[i]-1],i=1..nops(spts)),op(extrapts) ];
  L:= linearsystem(Lpts, nL, hvars);
  invfun:= L[1]/L[2];
  extrapts:= affpoint(extrapts,0);
  g:=  affpoly( L[1]-var*L[2], hvars,avars,0); ;
  phi:= array([0,0]);
  for i from 1 to 2 do
    R:= expand(resultant(f,g,avars[i mod 2 + 1]));
    N:= degree(R,avars[i]);
    phi[i]:= -coeff(R,avars[i],N-1)/coeff(R,avars[i],N);
    for k from 1 to nops(spts) do
      if expand(spts[k][1]) <> 0 then 
        phi[i]:= phi[i]-r[k]*(r[k]-1)*spts[k][1+i] 
      fi
    od;
    for k from 1 to nrofextra do phi[i]:= phi[i] - extrapts[k][i] od
  od; 
  convert(phi,list)
\end{verbatim}
\end{code}

\bigskip 

Bemerkung~: Die rationalen Parameterdarstellungen k"onnen nicht ohne weiteres
f"ur eine graphische Darstellung verwendet werden~:
\begin{itemize}
  \item Die Parameter-Intervalle, f"ur welche die Funktionswerte in einem
gew"unschten Bereich liegen, m"ussen bestimmt werden.
  \item Die Ausnahmewerte des Parameters m"ussen bestimmt werden (Pole).  
  \item Die rationalen Parameterfunktionen k"onnen komplexe Koeffizienten
enthalten.  
  \item Da jedem Parameterwert $t \in \C\/$ ein Punkt der Kurve entspricht, die
Parameterfunktionen aber nur f"ur ein Intervall aus $\R\/$ angezeigt werden
k"onnen, bleiben geschlossene Kurven in der graphischen Darstellung offen.
\end{itemize}


\subsubsection{{\tt implicit}}
\begin{kopf}{implicit(V,var,vars)}
  \pitem{V} Tupel von rationalen Funktionen aus $\C(\hbox{\tt var})$.
  \pitem{var} Variable der rationalen Funktionen \opt.
  \pitem{vars} Homogene oder affine Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Aus der expliziten Darstellung (rationale Parameterfunktionen in {\tt var})
wird die implizite Darstellung (Polynom in {\tt vars}) bestimmt. Default f"ur
{\tt var} ist {\tt explvar}. Im affinen Fall ist {\tt affvars}
Default f"ur {\tt vars} und im homogenen Fall {\tt homvars}.
\end{zweck}
\begin{algo}
Sei $(\phi(t),\psi(t))\/$ das Tupel rationaler Funktionen (affiner Fall)~:
\begin{eqnarray*}
  \phi(t) \: = &\frac{p_1(t)}{q_1(t)}\: = &x \\
  \psi(t) \: = &\frac{p_2(t)}{q_2(t)}\: = &y
\end{eqnarray*}
mit $p_i, q_i \in \C[t]$. Durch "Aquivalenzumformungen erh"alt man hieraus zwei
Polynome in $x,y\/$ und $t$~:
\begin{eqnarray*}
  f(x,y,t) & := & q_1(t)x - p_1(t) \: = 0\\
  g(x,y,t) & := & q_2(t)y - p_2(t) \: = 0 
\end{eqnarray*}
Die beiden Polynome haben genau dann eine gemeinsame Nullstelle bez"uglich
$t$, wenn die Resultante $R_{f,g}\/$ bez"uglich $t\/$ Null ist. Somit ist
$R_{f,g} \in \C[x,y]$, und \[ R_{f,g}(x,y) = 0\] ist die gesuchte Gleichung.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  IMPLICIT  ________________________________________________________

  f:= denom(v[1])*avars[1] - numer(v[1]);
  g:= denom(v[2])*avars[2] - numer(v[2]);
  if affcase then
    standard(resultant (f,g,var),avars)
  else
    standard(hompoly(resultant(f,g,var),avars,vars,nr),vars)
  fi    
\end{verbatim}
\end{code}


\subsection{Quadratische Transformationen }

Lineare Transformationen bringen keine wesentlichen "Anderungen in den
Singularit"aten einer Kurve. Man betrachte nun die quadratische Transformation
$T\/$ die durch 
\[ T\::\; (x_0,x_1,x_2) \mapsto (x_1x_2,x_0x_2,x_0x_1) \] 
gegeben ist und stellt folgendes fest~: ausserhalb des Fundamentaldreiecks
ist $T\/$ bijektiv ($T^{-1} = T$), und die Fundamentalgeraden $L_i\/$ werden auf
ihre `gegen"uberliegenden' Fundamentalpunkte $P_i\/$ abgebildet (z.B. $x_2 = 0$
auf $(0,0,1)$).

\begin{definition}\\
Ist $F(x_0,x_1,x_2) = 0\/$ die Gleichung einer ebenen algebraischen Kurve, so
hei"st die Kurve, deren Punkte der Gleichung
\[ G(x_0,x_1,x_2) = F(x_1x_2,x_0x_2,x_0x_1) = 0\]
gen"ugen, {\it die algebraische Transformierte\/} von $F$.
\end{definition}

\begin{definition}\\ 
Sei $F(x) = 0\/$ eine Kurve, die keine Fundamentalgerade als Komponente
enth"alt, und sei 
\[ G(x_0,x_1,x_2) := F(x_1x_2,x_0x_2,x_0x_1)\] 
Ist $G = \pi \tilde{F}$, wobei $\pi\/$ nur aus Potenzen von $x_0,x_1,x_2$
besteht und $\tilde{F}\/$ durch kein $x_i\/$ geteilt wird, so hei"st $\tilde{F}$
die {\it Transformierte von $F\/$ bez"uglich T\/}.
\end{definition}

\begin{satz}\\
Ist $\tilde{F}\/$ die Transformierte von $F\/$ bzgl.~$T$, dann ist $F\/$ die
Transformierte von $\tilde{F}\/$ bzgl.~$T$, und mit einer endlichen Zahl von
Ausnahmen entsprechen sich die Punkte von $F\/$ und $\tilde{F}\/$ eins zu eins;
die Komponenten entsprechen sich in der gleichen Weise.
\end{satz} 
\begin{beweis} \cite[III.7.1]{Wa} \end{beweis}

\begin{satz}\\
Sei $F\/$ eine Kurve der Ordnung $n\/$ mit $r_i$-fachen Punkten ($r_i \ge 0$) in
den Fundamentalpunkten $P_i$. Ausserdem sei keine Tangente in einem dieser
Punkte eine Fundamentalgerade. Dann gilt~:
\begin{enumgjlett}
  \item Die algebraische Transformierte $G\/$ von $F\/$ hat die
Fundamentalgerade $L_i\/$ ($x_i = 0$) als $r_i$-fache Komponente, und damit
hat $\tilde{F}\/$ die Ordnung $2n - \sum r_i$.
  \item Es besteht eine bijektive, Multiplizit"aten erhaltende Korrespondenz
zwischen den Tangenten von $F\/$ in $P_i\/$ und den nicht-fundamentalen
Schnittpunkten von $\tilde{F}\/$ mit $L_i$.
  \item $\tilde{F}\/$ hat Multiplizit"at $n-r_j-r_k\/$ in $P_i\/$ ($j,k \neq
i$), und die Tangenten sind verschieden von den Fundamentalgeraden. Sie
entsprechen den nicht-fundamentalen Schnittpunkten von $F\/$ mit $L_i$.
\end{enumgjlett}
\end{satz}
\begin{beweis} \cite[III.7.2]{Wa} \end{beweis}

\begin{satz}\\
Ein $r$-facher Punkt von $F$, der nicht auf einer Fundamentalgeraden liegt,
wird durch $T\/$ in einen $r$-fachen Punkt von $\tilde{F}\/$ transformiert, und
die Tangenten in diesen Punkten entsprechen sich in den Multiplizit"aten.
\end{satz}
\begin{beweis} \cite[III.7.3]{Wa} \end{beweis}

\begin{satz}\mylabel{quadsatz}\\
Durch eine Abfolge von quadratischen Transformationen kann jede irreduzible
Kurve in eine Kurve transformiert werden, die nur gew"ohnliche Singularit"aten
aufweist.
\end{satz}
\begin{beweis} \cite[III.7.4]{Wa} \end{beweis}


\subsubsection{{\tt quadtrans}}
\begin{kopf}{quadtrans(F,vars)}
  \pitem{F} Homogenes oder affines Polynom in drei resp.~zwei Variablen.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Es wird die Transformierte von {\tt F} bez"uglich $T\/$ berechnet.  Default f"ur
{\tt vars} ist {\tt getindets(F)}.
\end{zweck}
\begin{algo}
Ist {\tt F} ein affines Polynom in zwei Variablen, so wird {\tt F} zuerst
homogenisiert.  Die Transformation $T\/$ wird auf {\tt F} angewandt. Das
Resultat wird durch die gr"o"st\-m"og\-li\-chen Potenzen von $x_0,x_1\/$ und
$x_2\/$ dividiert.
\end{algo}

\begin{code}
\begin{verbatim}
# ___  QUADTRANS  ________________________________________________________

  G:= subs( [ hvars[1]=hvars[2]*hvars[3],hvars[2]=hvars[1]*hvars[3],
              hvars[3]=hvars[1]*hvars[2] ], lF);
  for i from 1 to 3 do
    for k from 0 do
      r:= rem(G,hvars[i],hvars[i],'G');
      if r <> 0 then  G:= expand(G*hvars[i])+r; break fi
    od;
  od;  
\end{verbatim}
\end{code}

\begin{definition}\\
F"ur eine ebene Kurve $C\/$ mit gew"ohnlichen Singularit"aten der Multiplizit"at
$r_1,r_2,\ldots\/$ hei"st die Zahl
\[ p = \frac{(n-1)(n-2)}{2} - \sum \frac{r_i(r_i-1)}{2} \]
das {\it Geschlecht\/} von $C$.
\end{definition}

\begin{bemerkung}
\begin{enumgjlett}
  \item Das Geschlecht ist eine birationale Invariante.
  \item Eine Kurve ist rational genau dann, wenn das Geschlecht 0 ist.
  \item Quadratische Transformierte rationaler Kurven sind wieder rational.
  \item Birational "aquivalente Kurven haben dasselbe Geschlecht.
\end{enumgjlett}
\medskip
vgl. \cite[VI.5.3]{Wa}.
\end{bemerkung}

\medskip 

Im Prinzip ist es m"oglich mit Hilfe des Satzes \ref{quadsatz} das Geschlecht
einer Kurve zu bestimmen, und falls es null ist, eine Parameterdarstellung der
Kurve zu erzeugen. Im Beweis des Satzes wird in jedem Schritt zur Reduktion
von Singularit"aten ein Koordinatensystem postuliert, in welchem auf $(1,0,0)$
eine nicht-gew"ohnliche Singularit"at zu liegen kommt, die Kurve die beiden
anderen Fundamentalpunkte meidet, und keine der Fundamentalgeraden eine
Tangente an die Kurve ist.  W"ahrend die ersten beiden Forderungen durch {\tt
NonVertexTrans} erf"ullt werden k"onnen, stellt die Tangentenbedingung noch
ein Hindernis dar.

\newpage
\section{Graphische Darstellung}

\subsubsection{{\tt plotcurve}}
\begin{kopf}{plotcurve(f,hrange,vrange,numpts,vars)}
  \pitem{f} Einzelnes Polynom oder Liste von Polynomen in zwei Variablen.
  \pitem{hrange} Horizontaler Bereich.
  \pitem{vrange} Vertikaler Bereich.
  \pitem{numpts} Anzahl Punkte (pro Bereich) \opt.
  \pitem{vars} Polynomvariablen \opt.
\end{kopf}
\begin{zweck}
Es werden pro Bereich {\tt numpts} Punkte der Kurve(n) von {\tt f} bestimmt.
Die Liste der Punkte, die sowohl im horizontalen ({\tt vars[1]}) als auch im
vertikalen ({\tt vars[2]}) Bereich liegen, werden mit {\tt plot} graphisch
dargestellt. Ist {\tt f} eine Liste von Polynomen, so erscheinen die Punkte 
der Kurven aus {\tt f} in verschiedenen Farben (auf Farb-Bildschirmen).
Singularit"aten, die in beiden Bereichen liegen, werden in jedem Falle
dargestellt. Default f"ur {\tt numpts} ist 40, f"ur {\tt vars} {\tt
affvars}.
\end{zweck}

\begin{algo}
Sei $f\/$ das Polynom {\tt f} resp.~ein Polynom aus {\tt f}. Seien ausserdem
$x$ und $y\/$ die Variablen von {\tt vars}.  Beide Bereiche werden in {\tt
numpts} Abschnitte unterteilt. Dann wird $f\/$ mit den Geraden $x=h\/$ und
$y=v$ geschnitten, wobei $h\/$ die horizontalen und $v\/$ die vertikalen
Abschnittswerte durchl"auft. Die Schnittpunkte werden mit {\tt fsolve}
numerisch bestimmt.  Die Singularit"aten werden mit {\tt singularities}
bestimmt. Reicht die Genauigkeit f"ur einzelne Schnittpunkte nicht aus,
erscheint eine Fehlermeldung. In einem solchen Fall kann durch Erh"ohen von
{\tt Digits} versucht werden, die fehlenden Punkte zu bestimmen.
\end{algo}

\begin{code}
\begin{verbatim}
  for i from 1 to nrofpts+1 do  
    for curvenr from 1 to nops(curvelist) do  
      for factornr from 1 to nops(curvelist[curvenr]) do
        ff:= subs(vars[1]=xx,curvelist[curvenr][factornr]);
        if has(ff,vars[2]) then 
          sols:= traperror(fsolve(ff,vars[2],lry));
          if sols <> lasterror then
            sols:= [sols];
            pts[curvenr]:= pts[curvenr], 
                           seq(op([xx,sols[j]]),j=1..nops(sols))
          else
            warn:= true  
          fi  
        fi;
        ff:= subs(vars[2]=yy,curvelist[curvenr][factornr]);
        if has(ff,vars[1]) then
          sols:= traperror(fsolve(ff,vars[1],lrx));
          if sols <> lasterror then
            sols:= [sols];
            pts[curvenr]:= pts[curvenr], 
                           seq(op([sols[j],yy]),j=1..nops(sols))
          else
            warn:= true  
          fi  
        fi
      od
    od;      
    xx:= xx+incrx; yy:= yy+incry
  od;  
\end{verbatim}
\end{code}


Bemerkung~: das gew"ahlte Verfahren funktioniert f"ur beliebige algebraische
Kurven, unabh"angig vom Grad der Kurve oder Art und Anzahl der
Singularit"aten. Allerdings wird bei hohem Grad oder gro"ser Anzahl Terme der
Polynome eine l"angere Rechenzeit ben"otigt.


\vspace{2cm}

\subsection*{Dank}
Ich m"ochte an dieser Stelle Professor G.~J"ager f"ur die Betreuung der
Lizentiatsarbeit danken. Spezieller Dank geb"uhrt Tyko Stra"sen, der mit
zahlreichen Anregungen und Beratung in praktischen Fragen viel zum Gelingen
der Arbeit beigetragen hat. Ferner m"ochte ich Michael Monagan  f"ur die
Unterst"utzung in \maple--Fragen danken.



% Master File: algcurve.tex

\begin{thebibliography}{BKe}

    \bibitem[BK]{BK} {\sc Egbert Brieskorn, Horst Kn"orrer}, {\it Ebene
algebraische Kurven\/}, Birkh"auser Verlag, Basel, Boston, Stuttgart, 1981

    \bibitem[BKe]{BKe} {\sc Egbert Brieskorn, Horst Kn"orrer}, {\it Plane
Algebraic Curves\/}, Birkh"auser Verlag, Basel, Boston, Stuttgart, 1986

    \bibitem[Wa]{Wa} {\sc Robert J.~Walker}, {\it Algebraic 
Curves\/}, Princeton University Press, Princeton, New Jersey, 1950

    \bibitem[Wae]{Wae} {\sc Bartel Leenert van der Waerden}, {\it Einf"uhrung
in die algebraische Geometrie}, Die Grundlehren der mathematischen
Wissenschaften in Einzeldarstellungen, Bd.~51, Springer Verlag, Berlin,
Heidelberg, New York, 1973

    \bibitem[LR]{LR} {\sc Bruce W.~Char, Keith O.~Geddes, Gaston H.~Gonnet,
Benton L.~Leong, Michael B.~Monagan, Stephen M.~Watt}, {\it Maple V Language
Reference Manual\/}, Springer Verlag, New York, Berlin, Heidelberg, London,
Paris, Tokyo, Hong Kong, Barcelona, Budapest, 1991

    \bibitem[LiR]{LiR} {\sc Bruce W.~Char, Keith O.~Geddes, Gaston H.~Gonnet,
Benton L.~Leong, Michael B.~Monagan, Stephen M.~Watt}, {\it Maple V Library
Reference Manual\/}, Springer Verlag, New York, Berlin, Heidelberg, London,
Paris, Tokyo, Hong Kong, Barcelona, Budapest, 1991

    \bibitem[Ge]{Ge} {\sc K.~O.~Geddes, G.~Labahn, S.~R.~Czapor}, {\it
Algorithms for Computer Algebra\/}, erscheint demn"achst bei Kluwer publishers,
Holland
    
\end{thebibliography}


































\end{document}



