Funktion Teilerfremd

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Mad Andy.

    Funktion Teilerfremd

    Hallo
    Ich habe eine Funktion geschrieben die von 3 Zahlen alle Teilerfremden in einem Wertebereich von 2 bis 1000 ausgibt
    Nur ich habe ein Problem es klappt nicht richtig^^

    Quellcode

    1. Private Function pubKey_e(ByVal teiler, ByVal primFI, ByVal primOne, ByVal primTwo)
    2. For c As Integer = 2 To 1000
    3. If Teilerfremd(teiler, primFI) = 1 And teiler <> primOne And teiler <> primTwo Then
    4. Console.Write(teiler)
    5. End If
    6. Next c
    7. End Function
    8. Private Function Teilerfremd(ByVal teiler, ByVal primFI)
    9. For c As Integer = 2 To primFI
    10. If teiler Mod c = primFI Mod c = 0 Then
    11. Return 0
    12. Else
    13. Return 1
    14. End If
    15. Next c
    16. End Function


    Ich bekomme immer nur die Zahl 2 Ausgegeben ich versuche seit heut morgen die Funktion zum laufen zu bringen aber vergeblich...
    Hoffe auf Hilfe
    Mfg
    Ich versteh die frage nicht ganz du meinst jetz die Funktion Teilerfremd?
    und ja es geht schon um Primzahlen das soll ein Consolepogramm werden das den eingegebenen Text mittels RSA-Verschlüsslung entschlüsselt
    Habe mir das in Python vorgeschrieben und das soll die VB üversetzung von dem python code hier sein

    Quellcode

    1. def Teilerfremd(a,b):
    2. for c in range(2,b):
    3. if a%c==b%c==0:
    4. return 0
    5. else:
    6. return 1

    Also wenn a Mod c = b Mod c= 0 ist dann gebe 0 zurück sonst 1
    Python ist wirklich die einzige Sprache, die ohne Tabs nicht lesbar ist ...

    Ich hab mich auch schon mal mit RSA gespielt, hab das leider nicht mehr wirklich im Kopf.
    Hab nicht viel Erfahrung mit Python, was macht range?

    a%c == b%c == 0 ist ein Doppelverlgeich, das gibts in VB nicht. Die Ergebnisse der Vergleiche muss man logisch verknüpen.
    if (a mod c = 0) and (b mod c = 0) then
    Die Klammern kann man eigentlich weglassen, find aber, dass mans besser lesen kann.
    k

    Dann müsste die For-Schleife stimmten.
    Abgesehen von dem Doppelvergleich sehe ich eigentlich keinen Fehler. Gibts ne Fehlermeldung?

    Hast du dir Python auf Windows installiert? Eigentlich hätte ich hier (Ubuntu) das Terminal auch selbst anwerfen können ^^
    Ja Python is bei mir auf Gentoo und Windoof drauf Visual Studio spuckt auch keinen fehler im Code aus ich bekomm einfach nicht das erhoffte ergebniss sondern nur den wert 2 :P
    Ich denke mal da ist irgendwo ein denkfehler drin aber ka wo

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Impi“ ()

    nene habe mir Windoof gebootet und das oben wa ein ausschnitt meines Quellcodes aus Eclips den ich jetz in VB übertragen möcht aber es haüüert halt an dieser Funktion

    Ich zeig euch mal den ganzen Quellcode meinen RSA-Consolen Programmes...

    VB.NET-Quellcode

    1. Module RSA
    2. Private primOne As Integer = 0
    3. Private primTwo As Integer = 0
    4. Private primFI As Integer = 0
    5. Private rsaE As Integer = 0
    6. Private rsaN As Integer = 0
    7. Private teiler As Integer = 2
    8. Sub Main()
    9. 'User Begrüßung
    10. SayHello()
    11. 'Hole Eingabewerte
    12. GetInputValues()
    13. 'Rechne
    14. rsaN = pubKey_n(primOne, primTwo)
    15. primFI = pubKey_fi(primOne, primTwo)
    16. 'Gibt mögliche Werte für E aus und nimmt diese auch entgegen
    17. rsaE = pubKey_e(teiler, primOne, primTwo, primFI)
    18. End Sub
    19. Private Sub SayHello()
    20. Console.WriteLine("Hallo und Willkommen zu RSA-Consol")
    21. Console.WriteLine("Copyright © 2008 Paul Becker")
    22. End Sub
    23. Private Function GetValue(ByVal Prompt As String) As String
    24. Console.Write(Prompt)
    25. Return Console.ReadLine
    26. End Function
    27. Private Sub GetInputValues()
    28. 'Hier holen wir und unsere Eingabewerte
    29. Console.WriteLine()
    30. primOne = CInt(GetValue("Geben Sie eine Primzahl ein: "))
    31. primTwo = CInt(GetValue("Geben Sie eine weitere Primzahl ein, diese darf mit der ersten Primzahl nicht identisch sein...: "))
    32. Console.WriteLine()
    33. End Sub
    34. Private Function pubKey_n(ByVal primOne, ByVal primTwo) As Integer
    35. 'Wir rechnen hier den ersten Teil des Öffentlichen Schlüssels
    36. Dim nReturn As Integer = (primOne) * (primTwo)
    37. Return nReturn
    38. End Function
    39. Private Function pubKey_fi(ByVal primOne, ByVal primTwo) As Integer
    40. 'Wir rechnen hier den zweiten Teil des Öffentlichen Schlüssels
    41. Dim fiReturn As Integer = (primOne - 1) * (primTwo - 1)
    42. Return fiReturn
    43. End Function
    44. Private Function pubKey_e(ByVal teiler, ByVal primFI, ByVal primOne, ByVal primTwo)
    45. For c As Integer = 1 To 1000
    46. If Teilerfremd(teiler, primFI) = 1 And teiler <> primOne And teiler <> primTwo Then
    47. Console.Write(teiler)
    48. End If
    49. Next c
    50. End Function
    51. Private Function Teilerfremd(ByVal teiler, ByVal primFI)
    52. For c As Integer = 1 To primFI
    53. If (teiler Mod c) = (primFI Mod c = 0) Then
    54. Return 0
    55. Else
    56. Return 1
    57. End If
    58. Next c
    59. End Function
    60. End Module


    Vlt wird das jetz ein bissel einschichtiger

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mad Andy“ ()

    Ja in Python klappt das wunderbar

    Brainfuck-Quellcode

    1. from string import find, printable
    2. def Teilerfremd(a,b):
    3. for c in range(2,b):
    4. if a%c==b%c==0:
    5. return 0
    6. else:
    7. return 1
    8. def pubKey_n(seq):
    9. liste = list(seq)
    10. zahlen = [int(item)
    11. for item in liste]
    12. return reduce(lambda p,q: p*q, zahlen)
    13. def pubKey_fi(seq):
    14. liste = list(seq)
    15. zahlen = [int(item)
    16. for item in liste]
    17. return reduce(lambda p,q: (p-1)*(q-1), zahlen)
    18. print('----------------------------------------------------------------------------------------------------')
    19. print(' RSA ')
    20. print('----------------------------------------------------------------------------------------------------')
    21. p = raw_input("Geben Sie eine Primzahl ein: ")
    22. q = raw_input("Geben Sie eine weitere Primzahl ein... Achtung die Primzahlen d\xfcrfen nicht identisch sein!! :")
    23. print ('----------------------------------------------------------------------------------------------------')
    24. p = int(p)
    25. q = int(q)
    26. a = 2
    27. public_n = pubKey_n((p, q))
    28. public_fi = pubKey_fi((p, q))
    29. print("F\xfcr e kommen in Frage")
    30. while 1:
    31. if Teilerfremd(a,public_fi)==1 and a!=p and a!=q:
    32. print a,
    33. if a==1000:
    34. break
    35. a+=1
    36. print ("----------------------------------------------------------------------------------------------------")
    37. e = raw_input("Geben Sie e ein!: ")
    38. e = int(e)
    39. print ("----------------------------------------------------------------------------------------------------")
    40. d = 0
    41. while (e * d % public_fi)!=1:
    42. d+=1
    43. if d==e:
    44. d+=1
    45. print ("Daraus ergibt sich d: ")
    46. print ("d = "),d
    47. print ("--------------------------------------------------------------------------------------------------- ")
    48. text=raw_input("Geben Sie den Text ein:\n")
    49. for zeichen in text:
    50. print zeichen,":",find(printable,zeichen),"**",e,"%",n


    Das Programm in Python sollte als eine Art vorlage dienen ich mach das step by step als nächstes kommt dann eine Windows-Form-Application
    und es wir auch immermehr verfeinert

    terminal schrieb:

    a : 10 ** 973 %
    Traceback (most recent call last):
    File "./test.py", line 61, in <module>
    print zeichen,":",find(printable,zeichen),"**",e,"%",n
    NameError: name 'n' is not defined
    :P

    Kannst du die VB-Version mal debuggen (step-by-step) und schauen, wo der Fehler liegt? Ich find ihn einfach nicht :(
    habe ich schon gemacht er läuft ganz normal durch bis zum schluss ohne irgendnen fehler
    da muss was in der berechnung nicht stimmen der gibt nur schwachsinn aus :(
    Ich muss dazu sagen das der Python Code ein Q & D code is

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Impi“ ()

    Q & D = Quick & Dirty
    Ich suche den Fehler jetz seit über 10 stunden und mit zwei Variablen ist das auch garkein Problem aber mit 3 ist das echt schwer -.-
    Und der Python Code sollte nur eine Vorlage sein und meineserachtens habe ich das 1 zu 1 übernommen wüsste nicht wo da ein fehler ist die fehlende range funktion habe ich mit einer for schleife gelöst hmmm
    Ok habe den fehler gefunden der Zähler der For schleife in der Teilerfemd funktion Zählt nicht hoch... hmmm wie kann ich das lösen das die If funktion ihre arbeit macht aber dennoch das Next statment ausgeführt wird?
    Edit mit der step anweisung klappt es auch net hmm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Impi“ ()

    Ahhh, ich seh das Problem...
    Versuch mal so:

    VB.NET-Quellcode

    1. Private Function Teilerfremd(ByVal teiler, ByVal primFI)
    2. For c As Integer = 1 To primFI
    3. If (teiler Mod c = 0) and (primFI Mod c = 0) Then
    4. Return 0
    5. End If
    6. Next c
    7. Return 1
    8. End Function


    Ich würde übrigens nicht mit 1 und 0 arbeiten, sondern mit true und false

    Dein If war auch falsch.
    (primFI Mod c = 0) liefert Boolean
    (teiler mod c) liefert Integer
    Und dann hast du nen Boolean mit em Integer verglichen, was sinngemäß falsch ist
    hö?
    Ich glaub es muss 2 to primFI sein, und nicht 1 to primFI.

    Das If aus deinem Python script soll ein Doppelvergleich sein, oder?
    Also wenn sich beide durch irgendwas zwischen 2 und primFI teilen lassen sind sie nicht Teilerfremd (return 0).
    Nur Wenn keine Zahl c der Menge [2...PrimFI] bei beiden als Teiler zählt, kommt das Programm unten zum Return 1

    Ich vermute, dass im 1er der Hund steckt.