def createFractal4(reduction, N, proportion): #parameters M = 2*N twoQuads = True angles, lengths = mojette.angleSet_Symmetric(N,N,1,True,50) perpAngle = farey.farey(1,0) angles.append(perpAngle) powerSpect = np.zeros((M,M)) #compute lines centered = True mLines = [] sLines = [] mValues = [] sValues = [] pValues = [] qValues = [] for angle in angles: m, s, p, q, inv = farey.toFinite(angle, M) pValues.append(p) qValues.append(q) if m not in mValues and m < M: u, v = radon.getSliceCoordinates2(m, powerSpect, centered, M) mLines.append((u,v)) mValues.append(m) #second quadrant if twoQuads: if m != 0 and m != M: #dont repeat these m = M-m if m not in mValues and m < M: u, v = radon.getSliceCoordinates2(m, powerSpect, centered, M) mLines.append((u,v)) mValues.append(m) i = (len(mValues)+len(sValues))/float(M) if i >= 1: break ss = [] ss.append(M) ss.extend(range(0, N/2)) maxLines = len(ss) for i,s in enumerate(ss): u, v = radon.getSliceCoordinates2(s, powerSpect, centered, M) sLines.append((u,v)) sValues.append(s) i = (len(mValues)+len(sValues))/float(M) if i >= 1.5: break length = 0 fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(16, 8)) plt.gray() plt.tight_layout() maxLines = len(sLines+mLines) i = 0 ax[0].imshow(powerSpect) ax[1].imshow(powerSpect) color=iter(cm.jet(np.linspace(0,1,maxLines+1))) fareyImage = np.zeros_like(powerSpect) fareyImage1 = np.zeros_like(powerSpect) for i, sLine in enumerate(sLines): u, v = sLine ax[1].plot(u, v, '.w',markersize=1) fareyImage[u,v] = 1 length = length + 1 i = np.count_nonzero(fareyImage)/float((M*M)) if i >= reduction*proportion: break maxLines = len(mLines) for i, mLine in enumerate(mLines): u, v = mLine ax[0].plot(u, v, '.r', markersize=1) ax[1].plot(u, v, '.r',markersize=1) fareyImage[u,v] = 1 fareyImage1[u,v] = 1 length = length + 1 i = np.count_nonzero(fareyImage)/float((M*M)) if i >= reduction: break print("Proportion of M:", (length/float(M))) print("Non-zero elements with holes: ", np.count_nonzero(fareyImage1)/float((M*M)) * 100) print("Non-zero elements without holes: ", np.count_nonzero(fareyImage)/float((M*M)) * 100) print("Absolute difference percentage extra filled in is ", (np.count_nonzero(fareyImage)- np.count_nonzero(fareyImage1))/float((M*M)) *100) withHoles = np.count_nonzero(fareyImage1)/float((M*M)) * 100 withoutHoles = np.count_nonzero(fareyImage)/float((M*M)) * 100 percentage = (withoutHoles - withHoles)/float(withHoles) * 100 print("Percentage difference percentage extra filled in is ", percentage) ax[0].set_title('Sampling (colour per line) for dyadic size:'+str(M)) ax[1].set_title('Sampling (same colour per line) for dyadic size:'+str(M)) imageio.imsave("farey_image_"+str(M)+"_"+".png", fareyImage) plt.show() lines = mLines + sLines return fareyImage, lines
def angleSubSets_Symmetric(s, mode, P, Q, octant=0, binLengths=False, K=1): ''' Generate the minimal L1 angle set for the MT for s subsets. Parameter K controls the redundancy, K = 1 is minimal. If octant is non-zero, full quadrant will be used. Octant schemes are as follows: If octant = -1, the opposing octant is also used. If octant = 0,1 (default), only use one octant. If octant = 2, octant will be mirrored from diagonal to form a quadrant. If octant = 4, 2 quadrants. If octant = 8, all quadrants. Function can also return bin lengths for each bin. ''' angles = [] subsetAngles = [] for i in range(s): subsetAngles.append([]) fareyVectors = farey.Farey() maxPQ = max(P, Q) fareyVectors.compactOff() fareyVectors.generate(maxPQ - 1, 1) vectors = fareyVectors.vectors sortedVectors = sorted( vectors, key=lambda x: x.real**2 + x.imag**2) #sort by L2 magnitude index = 0 subsetIndex = 0 binLengthList = [] angles.append(sortedVectors[index]) subsetAngles[subsetIndex].append(sortedVectors[index]) binLengthList.append(projectionLength(sortedVectors[index], P, Q)) while not isKatzCriterion(P, Q, angles, K) and index < len(sortedVectors): # check Katz index += 1 angles.append(sortedVectors[index]) subsetAngles[subsetIndex].append(sortedVectors[index]) p, q = farey.get_pq(sortedVectors[index]) # p = imag, q = real binLengthList.append(projectionLength(sortedVectors[index], P, Q)) # if isKatzCriterion(P, Q, angles): # break if octant == 0: continue #add octants if octant == -1: nextOctantAngle = farey.farey(p, -q) #mirror from axis angles.append(nextOctantAngle) subsetAngles[subsetIndex].append(nextOctantAngle) binLengthList.append(projectionLength(nextOctantAngle, P, Q)) if mode == 1: subsetIndex += 1 subsetIndex %= s if octant > 0 and p != q: nextOctantAngle = farey.farey(q, p) #swap to mirror from diagonal angles.append(nextOctantAngle) subsetAngles[subsetIndex].append(nextOctantAngle) binLengthList.append(projectionLength(nextOctantAngle, P, Q)) if mode == 1: subsetIndex += 1 subsetIndex %= s if octant > 1: nextOctantAngle = farey.farey(p, -q) #mirror from axis angles.append(nextOctantAngle) subsetAngles[subsetIndex].append(nextOctantAngle) binLengthList.append(projectionLength(nextOctantAngle, P, Q)) if mode == 1: subsetIndex += 1 subsetIndex %= s if p != q: #dont replicate nextOctantAngle = farey.farey( q, -p) #mirror from axis and swap to mirror from diagonal angles.append(nextOctantAngle) subsetAngles[subsetIndex].append(nextOctantAngle) binLengthList.append(projectionLength(nextOctantAngle, P, Q)) if mode == 1: subsetIndex += 1 subsetIndex %= s if mode == 0: subsetIndex += 1 subsetIndex %= s if octant > 1: #add the diagonal and column projections when symmetric (all quadrant are wanted) nextOctantAngle = farey.farey(1, 0) #mirror from axis angles.append(nextOctantAngle) subsetAngles[0].append(nextOctantAngle) binLengthList.append(projectionLength(nextOctantAngle, P, Q)) if binLengths: return angles, subsetAngles, binLengthList return angles, subsetAngles
import numpy as np #parameters N = 512 M = 2*N K = 1 twoQuads = True print("N:", N, "M:", M) #p = nt.nearestPrime(M) #print("p:", p) #pDash = nt.nearestPrime(N) #print("p':", pDash) #angles = mojette.angleSet_Finite(pDash, 2) angles, lengths = mojette.angleSet_Symmetric(N,N,1,True,K) #here #getProjectionCoordinates perpAngle = farey.farey(1,0) angles.append(perpAngle) print("Number of Angles:", len(angles)) print("angles:", angles) #powerSpect = np.zeros((p,p)) powerSpect = np.zeros((M,M)) #np.set_printoptions(threshold=np.nan) #compute lines print("Computing Finite lines...") centered = True lines = [] mValues = [] pValues = []
''' Test for the pure independent modules for number theory ''' import _libpath #add custom libs import finitetransform.numbertheory as nt import finitetransform.farey as farey x = 5 m = 641 ########## # test the multiplicative inverse mod m inv = nt.minverse(x, m) print inv identity = (inv * x) % m print identity ########## # test the Farey finite vector function vector = farey.farey(1, 2) m = farey.toFinite(vector, m) print vector, "->", m