Matroids Matheplanet Forum Index
Moderiert von matroid mire2
Mathematische Software & Apps » Sage - Sagemath » Sage / Python: Algorithmus dauert sehr lange
Druckversion
Druckversion
Antworten
Antworten
Autor
Kein bestimmter Bereich Sage / Python: Algorithmus dauert sehr lange
Ehemaliges_Mitglied
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2020-01-11


Ich habe hier einen Algorithmus. Einfach Beispiele
a = 1      # Dividend
b = 17     # Divisor

werden unproblematisch ausgegeben.

Für komplizierte Beispiele
a = 1      # Dividend
b = 857    # Divisor

braucht er sehr lange.

Was könnte ich da machen?

Ich gebe den Algorithmus in Originalform wieder:
Sage
reset()
os.chdir('C:\Users\ccc\Desktop\Test\Dezimalbruchentwicklung\Resultat')
print os.getcwd()
#%save RdividedM01 -f 1 
## r / m 
## Input Variables
## good:
# a = 1      # Dividend
# b = 17     # Divisor
## bad:
a = 1       # Dividend
b = 857     # Divisor
## Calculations
r = numerator(a/b)
m = denominator(a/b)
def n(i):
    if i==0:
        return r%m
    else:
        return 10*(n(i-1)-Q(i-1)*m)
#
def Q(i):
    if i==0:
        return 0#r//m
    else:
        return n(i)//m
# PeriodLength and PreperiodLength
u = denominator(a/b).valuation(2)
v = denominator(a/b).valuation(5)
def PreperiodLength(a,b): return max(u,v)
 
M = denominator(a/b) / (2^u*5^v)
y = 1/M
def PeriodLength(a,b):
    if M == 1:
        return 0
    else:
        return y.period()
 
Length(a,b) = PreperiodLength(a,b) + PeriodLength(a,b)
## Output: 
print('PreperiodLength: {}'.format(PreperiodLength(a,b)))
print('PeriodLength: {}'.format(PeriodLength(a,b)))
 
data = [(i,n(i),Q(i)) for i in range (1,Length(a,b)+1)] 
 
#pattern = "{:3}, {:5}, {:5}"
pattern = ', '.join(['{:5}'] * len(data[0]))
nice_str = '\n'.join([pattern.format(*tup) for tup in data])
print(nice_str)
 
def save_string(path, string, mode='w'):
    with open(path, mode) as file:
        file.write(string)
 
save_string('test.txt', nice_str)



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
querin
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 12.01.2018
Mitteilungen: 327
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2020-01-11


Ich würde Memoisation verwenden:
Sage
a = 1       # Dividend
b = 857     # Divisor
## Calculations
r = numerator(a/b)
m = denominator(a/b)
 
n_dic={0:r%m}  # n Memoisation
def n(i):
    if i not in n_dic:
        n_dic[i]=10*(n(i-1)-Q(i-1)*m)
    return n_dic[i]
#
Q_dic={0:0}  # Q Memoisation
def Q(i):
    if i not in Q_dic:
        Q_dic[i]=n(i)//m
    return Q_dic[i]
 
# PeriodLength and PreperiodLength
u = denominator(a/b).valuation(2)
v = denominator(a/b).valuation(5)
def PreperiodLength(a,b): return max(u,v)
 
M = denominator(a/b) / (2^u*5^v)
y = 1/M
def PeriodLength(a,b):
    if M == 1:
        return 0
    else:
        return y.period()
 
Length(a,b) = PreperiodLength(a,b) + PeriodLength(a,b)
## Output: 
print('PreperiodLength: {}'.format(PreperiodLength(a,b)))
print('PeriodLength: {}'.format(PeriodLength(a,b)))
 
data = [(i,n(i),Q(i)) for i in range (1,Length(a,b)+1)] 
 
#pattern = "{:3}, {:5}, {:5}"
pattern = ', '.join(['{:5}'] * len(data[0]))
nice_str = '\n'.join([pattern.format(*tup) for tup in data])
print(nice_str)
 
def save_string(path, string, mode='w'):
    with open(path, mode) as file:
        file.write(string)
 
save_string('test.txt', nice_str)



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Ehemaliges_Mitglied
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2020-01-11


2020-01-11 19:11 - querin in Beitrag No. 1 schreibt:
Ich würde Memoisation verwenden:

Oh, damit is es offensichtlich ein Unterschied wie Tag und Nacht.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Ehemaliges_Mitglied hat die Antworten auf ihre/seine Frage gesehen.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]