def toFinite(fareyVector, N): ''' Return the finite vector corresponding to the Farey vector provided for a given modulus/length N and the multiplicative inverse of the relevant Farey angle Wraps function from Farey module ''' return farey.toFinite(fareyVector, N)
def toDRT(projections, angles, N, P, Q, center=False): ''' Convert the Mojette (asymetric) projection data to DRT (symetric) projections. Use the iFRT to reconstruct the image. Requires N+1 or N+N/2 projections if N is prime or dyadic respectively. Returns the resulting DRT space as a 2D array ''' size = int(N + N/2) dyadic = True if N % 2 == 1: # if odd, assume prime size = int(N+1) dyadic = False m = 0 frtSpace = np.zeros( (size,N) ) if dyadic: print("Dyadic size not tested yet.") #for each project '''for index, proj in enumerate(projections): p, q = farey.get_pq(angles[index]) m, inv = farey.toFinite(angles[index], N) frtSpace[m][:] = finiteProjection(proj, angles[index], P, Q, N, center)''' else: #prime size for index, proj in enumerate(projections): p, q = farey.get_pq(angles[index]) m, inv = farey.toFinite(angles[index], N) frtSpace[m][:] = finiteProjection(proj, angles[index], P, Q, N, center) return frtSpace
def finiteProjection(projection, angle, P, Q, N, center=False): ''' Convert a Mojette projection taken at angle into a finite (FRT) projection. ''' dyadic = True if N % 2 == 1: # if odd, assume prime dyadic = False shiftQ = int(N / 2.0 + 0.5) - int(Q / 2.0 + 0.5) shiftP = int(N / 2.0 + 0.5) - int(P / 2.0 + 0.5) finiteProj = np.zeros(N) p, q = farey.get_pq(angle) m, inv = farey.toFinite(angle, N) # print "p:", p, "q:", q, "m:", m, "inv:", inv translateOffset, perp = farey.finiteTranslateOffset(angle, N, P, Q) angleSign = p * q if dyadic: for translate, bin in enumerate(projection): if angleSign >= 0 and perp: #Reverse for perp translateMojette = translateOffset - translate else: translateMojette = translate - translateOffset translateFinite = (inv * translateMojette) % N if center: translateFinite = (translateFinite + shiftQ + m * (N - shiftP)) % N finiteProj[translateFinite] += bin else: for translate, bin in enumerate(projection): if angleSign >= 0 and perp: #Reverse for perp translateMojette = int(translateOffset) - int(translate) else: translateMojette = int(translate) - int(translateOffset) if translateMojette < 0: translateFinite = (N - (inv * abs(translateMojette)) % N) % N else: translateFinite = (inv * translateMojette ) % N #has issues in C, may need checking if center: translateFinite = (translateFinite + shiftQ + m * (N - shiftP)) % N finiteProj[translateFinite] += bin return finiteProj
def angleSetSliceCoordinates(angles, P, Q, N, center=False): ''' Compute the 2D coordinates of each translate (in NxN DFT space) of every projection having angle in angles. Returns a list of u, v coordinate arrays [[u_0[...],v_0[...]], [u_1[...],v_1[...]], ...] per angle ''' coords = [] translateOffset = 0 translateMojette = 0 translateFinite = 0 m = 0 offset = 0.0 if center: offset = N / 2.0 for index, angle in enumerate(angles): u = [] v = [] coordinateList = [] p = int(angle.imag) q = int(angle.real) angleSign = p * q m, inv = farey.toFinite(angle, N) translateOffset, perp = farey.finiteTranslateOffset(angle, N) B = projectionLength(angle, P, Q) for translate in range(0, B): if angleSign >= 0 and perp: #Reverse for perp translateMojette = translateOffset - translate else: translateMojette = translate - translateOffset translateFinite = (inv * translateMojette ) % N #has issues in C, may need checking # frtSpace[m][translateFinite] += bin u.append((translateFinite + offset) % N) v.append((m * translateFinite + offset) % N) coordinateList.append(u) coordinateList.append(v) coords.append(coordinateList) return coords
def computeLines(kSpace, angles, centered=True, twoQuads=False): ''' compute finite lines coordinates Returns a list or list of slice 2-tuples and corresponding list of m values ''' p, s = kSpace.shape lines = [] mValues = [] for angle in angles: m, inv = farey.toFinite(angle, p) u, v = radon.getSliceCoordinates2(m, kSpace, centered, p) lines.append((u, v)) mValues.append(m) #second quadrant if twoQuads: if m != 0 and m != p: #dont repeat these m = p - m u, v = radon.getSliceCoordinates2(m, kSpace, centered, p) lines.append((u, v)) mValues.append(m) return lines, mValues
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
powerSpect = np.zeros((M,M)) #np.set_printoptions(threshold=np.nan) #compute lines print("Computing Finite lines...") centered = True lines = [] mValues = [] pValues = [] qValues = [] z=25 for angle in angles: #m, inv = farey.toFinite(angle, p) #u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p) m, p, q, inv = farey.toFinite(angle, M) u, v = radon.getSliceCoordinates2(m, powerSpect, centered, M) lines.append((u,v)) mValues.append(m) pValues.append(p) qValues.append(q) #second quadrant if twoQuads: #if m != 0 and m != p: #dont repeat these if m != 0 and m != M: #dont repeat these #m = p-m #u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p) m = M-m z = M-2*z u, v = radon.getSliceCoordinates2(m, powerSpect, centered, M)
angles.append(perpAngle) print("Number of Angles:", len(angles)) print("angles:", angles) powerSpect = np.zeros((p, p)) #compute lines print("Computing Finite lines...") centered = True lines = [] mValues = [] pValues = [] qValues = [] for angle in angles: m, p1, q, inv = farey.toFinite(angle, p) u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p) lines.append((u, v)) mValues.append(m) pValues.append(p1) qValues.append(q) #second quadrant if twoQuads: if m != 0 and m != p: #dont repeat these m = p - m u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p) lines.append((u, v)) mValues.append(m) mu = len(lines) print("Number of lines:", len(lines)) print("Proportion of p:", len(lines) / float(p))
#angles = mojette.angleSet_Finite(pDash, 2) angles, lengths = mojette.angleSet_Symmetric(N, N, 1, True, K) perpAngle = farey.farey(1, 0) angles.append(perpAngle) print("Number of Angles:", len(angles)) print("angles:", angles) powerSpect = np.zeros((p, p)) #compute lines print("Computing Finite lines...") centered = True lines = [] mValues = [] for angle in angles: m, inv = farey.toFinite(angle, p) u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p) lines.append((u, v)) mValues.append(m) #second quadrant if twoQuads: if m != 0 and m != p: #dont repeat these m = p - m u, v = radon.getSliceCoordinates2(m, powerSpect, centered, p) lines.append((u, v)) mValues.append(m) mu = len(lines) print("Number of lines:", len(lines)) print("Proportion of p:", len(lines) / float(p)) print("Proportion of 2D space:", 2.0 - len(lines) / float(p)) print(mValues)
''' 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