Fortran Code

Hallo zusammen,

nach langer Suche habe ich für mein Problem endlich einen Algorithmus gefunden. Allerdings ist das Buch von 78 und Code sowie Pseudocode in FORTRAN.

Es geht darum eine n-elementige Menge {1,2,…,n} in alle möglichen Partitionen zu zerlegen.

Es sind nur nur 26 Zeilen. Vieleicht kann einer von den Profis entweder:

eine c-Umwandlung
eine java-Umwandlung
oder einen verständlicheren Pseudocode angeben?

PseudoCode:
http://img146.imageshack.us/img146/8693/pseudofortra…

Variablen:
http://img181.imageshack.us/img181/9577/varfortrannl…

Code:
SUBROUTINE NEXEQU(N,NC,P,Q,MTC)
INTEGER P(N), Q(N)
LOGICAL MTC
IF(MTC) GO TO 20
10 NC=1
DO 11 I=1, N
11 Q(I)=1
P(1)=N
60 MTC=NC.NE.N
RETURN
20 M=N
30 L=Q(M)
IF(P(L).NE.1) GO TO 40
Q(M) = 1
M=M-1
GO TO 30
40 NC=NC+M-N
P(1)=P(1)+N-M
IF(L.NE.NC) GO TO 50
NC=NC+1
P(NC)=0
50 Q(M)=L+1
P(L)=P(L)-1
P(L+1)=P(L+1)+1
GO TO 60
END

Vielen Dank, falls sich jemand erbarmt und mir weiter hilft.
Gruß
Joerg

Moien

Es geht darum eine n-elementige Menge {1,2,…,n} in alle
möglichen Partitionen zu zerlegen.

Das hört sich einfach an. Das müsste man auch direkt in java oder C++ finden.

eine c-Umwandlung

http://en.wikipedia.org/wiki/F2c

eine java-Umwandlung

http://mstier.de/wiki/Fortran2Java

cu

Hallo Jorsch

nach langer Suche habe ich für mein Problem endlich einen
Algorithmus gefunden. Allerdings ist das Buch von 78 und Code
sowie Pseudocode in FORTRAN.

Ja, so war das damals :wink:

eine c-Umwandlung

Kann ich leider nicht mit dienen :-/

eine java-Umwandlung

Kann ich leider nicht mit dienen :-/

oder einen verständlicheren Pseudocode angeben?

Ich finde den durchaus verständlich.
Was allerdings völlig fehlt, ist ein „Rahmenprogramm“, das diese Funktion nutzt! Wie sind die Parameter zu initialisieren, wie die Funktion aufzurufen, was geschieht mit den „Zwischenergebnissen“ (soweit ich den Code verstanden habe, berechnet der ja immer nur eine „Partition“ bei jedem Aufruf),…

Einige Erklärungen zu Fortran:

DO 11 I=1, N
11 Q(I)=1

Das entspricht einer For-Schleife (FOR I = 1 To N) die den Code aus Zeile 11 entsprechend oft ausführt.

MTC=NC.NE.N

„.NE.“ bedeutet „ungleich“ (Not Equal), also: MTC = NC N
Ansonsten sehe ich keine Unklarheiten. Den Rest sollte man lesen (und verstehen) können.

Vielen Dank, falls sich jemand erbarmt und mir weiter hilft.

Ich weiss nicht, ob Dir das hilft, ich hätte da noch die Übersetzung der Fortran-Routine nach VB/VBA anzubieten:

Sub NEXEQU(N As Long, NC As Long, P() As Long, Q() As Long, MTC As Boolean)
Dim I As Long, M As Long, L As Long

If Not MTC Then ' letzter
 NC = 1

 For I = 1 To N
 Q(I) = 1
 Next I

 P(1) = N

Else ' nicht letzter
 M = N

 L = Q(M)

 Do While P(L) = 1
 Q(M) = 1
 M = M - 1
 L = Q(M)
 Loop

 NC = NC + M - N
 P(1) = P(1) + N - M

 If L = NC Then
 NC = NC + 1
 P(NC) = 0
 End If

 Q(M) = L + 1
 P(L) = P(L) - 1
 P(L + 1) = P(L + 1) + 1
End If

If NC N Then
 MTC = True
Else
 MTC = False
End If

End Sub

Gruss
Peter

Hi und danke,

damit werd ich zurecht kommen.
Das Unterprogramm soll so oft aufgerufen werden, bis MTC zu false wird.

Welche Variablen sind denn nach dem Ende der Subroutine noch am leben?
Keine oder?

Hi und danke,

Gerne

damit werd ich zurecht kommen.

Ich hoffe es für Dich, ich bin es nämlich nicht :frowning:

Das Unterprogramm soll so oft aufgerufen werden, bis MTC zu
false wird.

Soweit habe ich es auch verstanden. Ich habe ein paar Versuche gemacht, aber da kam nur „Schrott“ 'raus. Es fehlt - wie im vorherigen Posting von mir schon angemerkt - eine Beschreibung, wie die Parameter vor dem ersten Aufruf zu füllen sind, usw.

Welche Variablen sind denn nach dem Ende der Subroutine noch
am leben?
Keine oder?

In VB/VBA werden die Parameter - wenn nicht anders deklariert - „by reference“ übergeben. In Java geht das nicht, da gibt’s nur „by value“, Du müsstest Dir also eine andere Lösung einfallen lassen.
Ergo: Im Code, so wie von mir gepostet:
Die „lokal“ deklarierten sind „weg“.
Die „Übergabeparameter“ müssen vom Aufrufer zur Verfügung gestellt werden. Sie werden dann in der Routine schreibend verwendet, der Aufrufer hat also anschliessend die geänderten Werte.

Gruss
Peter

[ot] Handarbeit?
Moin, Peter,

hast Du das Coding händisch umgeformt oder gibt es dafür Software? Ich habe mich heute früh mal drangesetzt und bin fast zum gleichen Ergebnis gekommmen - und auf die gleichen Fragen :smile:

Gruß Ralf

N’Abend Ralf

hast Du das Coding händisch umgeformt

Ja.
Es ist gefühlte 200 Jahre her, dass ich mal mit Fortran programmiert habe, da hat mich die Problemstellung einfach gereizt.

oder gibt es dafür Software?

In der ersten Antwort zu dieser Frage waren Links zu irgendwelchen „Konvertern“.

Ich habe mich heute früh mal drangesetzt und bin fast zum gleichen Ergebnis gekommmen

Na, das ist beruhigend… für mich :wink:

und auf die gleichen Fragen :smile:

Ja… und verstanden habe ich es immer noch nicht.

Gruss
Peter

Moin, Peter,

Es ist gefühlte 200 Jahre her, dass ich mal mit Fortran
programmiert habe

2008 - 1976 = 232 Jahre :smile:

Ja… und verstanden habe ich es immer noch nicht.

Was das soll, hat sich mir aus dem „Pseudo-Code“ auch nicht erschlossen, erinnert mich aber sehr an die 2 Blatt Papier, die ich 1976 vorgelegt bekam: „Datt is enne Schadstoffausbreitungrechnung, bis wann bisse fettich? Geht datt bis näxte Woche?“ Der Gudsde war Mathematiker und hatte schon mal ALGOL gesehen. Da wurden dann 60 Manntage draus :smile:

Gruß Ralf