2015-10-12 3 views
0

Я пытаюсь написать функцию в SageMath, которая печатает все номера такси (числа, которые равны сумме нескольких наборов из двух значений, кубированных и затем добавленных вместе), меньше или равно определенному значению (в моем коде я ссылаюсь на этот номер как переменная t).SageMath Как исправить список для номеров такси, которые должны быть правильно сгенерированы?

Я не могу понять, как внести соответствующие изменения для списков (которые я изначально написал в Python 2.7) для запуска в SageMath. В результате я получаю сообщение об ошибке:

Traceback (most recent call last):   for i in range(1,len(sums)-1): 
    File "", line 1, in <module> 

File "/private/var/folders/96/g5hyl4ps29dglpy8fnwww6x80000gn/T/tmpWiTKG1/___code___.py", line 16, in <module> 
exec compile(u'Ramanujan(_sage_const_10000) 
File "", line 1, in <module> 

File "/private/var/folders/96/g5hyl4ps29dglpy8fnwww6x80000gn/T/tmpWiTKG1/___code___.py", line 7, in  Ramanujan 
crev[x3] = x + _sage_const_1 ; 
IndexError: list assignment index out of range 

Код:

def Ramanujan(t): 
    cubes = [x**3 for x in range(1,t/10)]; 
    crev = [] # Calculating Cube Roots; 
    for x,x3 in enumerate(cubes): 
     crev[x3] = x + 1; 
     sums = sorted(x + y for x in cubes for y in cubes if y < x) # Organizing Data 
     for i in range(1,len(sums)-1): 
      if sums[i-1] != sums[i] and sums[i] == sums[i+1]: # Finding solutions 
       if sums[i]<=t: # Limiting how many solutions printed. 
        print "%10d"%(sums[i]) # Printing desired outputs 
       else: 
        break # Ending the function. 

Ramanujan(10000) 

(Ramanujan (10000) должен вызвать функцию для печати 2 значения меньше, чем 10000)

мне нужно сделать объявлять переменные в моей функции как переменные объекты? Не нужно ли создавать пустой список crev перед его заполнением? Это просто проблема с тем, как я пытаюсь использовать списки?

ответ

1

Я думаю, что строка crev[x3] = x + 1; должна быть crev.append(x+1): вы не можете назначить n-й элемент в списке, если длина списка меньше n. Или вы должны создать его с помощью crev = [0]*t, чтобы он изначально содержал все нули. На самом деле, если функция остается такой, как написано, эта строка должна быть полностью удалена: вы никогда не используете crev в остальной части функции.