SharedMath 314-18F.sagewsOpen in CoCalc
#This code produces Pascal's triangle up to row nrows.
#Note that it is a list of lists
nrows=10
pascal=[[1],[1,1]]
for r in [2..nrows]:
    nextrow=[1]
    prevrow=pascal[-1]
    lenPre=len(prevrow)
    for k in [0..lenPre-2]:
        nextrow.append(prevrow[k]+prevrow[k+1])
        
    nextrow.append(1)
    pascal.append(nextrow)
#here is a printout to test it
for r in pascal:
    print r
[1] [1, 1] [1, 2, 1] [1, 3, 3, 1] [1, 4, 6, 4, 1] [1, 5, 10, 10, 5, 1] [1, 6, 15, 20, 15, 6, 1] [1, 7, 21, 35, 35, 21, 7, 1] [1, 8, 28, 56, 70, 56, 28, 8, 1] [1, 9, 36, 84, 126, 126, 84, 36, 9, 1] [1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]
#Now we do the same thing, but mod m
m=3
nrows=10
pascal=[[1],[1,1]]
for r in [2..nrows]:
    nextrow=[1]
    prevrow=pascal[-1]
    lenPre=len(prevrow)
    for k in [0..lenPre-2]:
        nextrow.append(mod(prevrow[k]+prevrow[k+1],m))
        
    nextrow.append(1)
    pascal.append(nextrow)
#test it
for r in pascal:
    print r
[1] [1, 1] [1, 2, 1] [1, 0, 0, 1] [1, 1, 0, 1, 1] [1, 2, 1, 1, 2, 1] [1, 0, 0, 2, 0, 0, 1] [1, 1, 0, 2, 2, 0, 1, 1] [1, 2, 1, 2, 1, 2, 1, 2, 1] [1, 0, 0, 0, 0, 0, 0, 0, 0, 1] [1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1]
#the next lines of code count the number of odd numbers in each row.  You cannot just sum the elements in each row, because 
#the elements are NOT integers but instead are integers modulo 2, so they only sum to 0 (even) or 1 (odd)
#So we use a boolean expression. 

rowNum =0 #keep track of the row for output
for r in pascal: #here "r" is the actual row, with numerous elements if rowNum is large
    nOdd=0 #begin a sum
    for a in r:
        nOdd += a==1  #increment the value only if a equals 1, i.e. a is odd
    print rowNum, nOdd
    rowNum += 1   #increment the row number
0 1 1 2 2 2 3 2 4 4 5 4 6 2 7 4 8 5 9 2 10 4
#incidentally, you may want to use binary, etc.
n=2018
n.digits()
n.digits(base=2)
[8, 1, 0, 2] [0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1]

rowNum.digits(2)
[1, 1, 0, 1]