I wanted to see what configurations with this property looked like, so I made this brief animation:
There have been many, many articles written over the past few years bemoaning the rapid rise of college tuition. Often there is an implication that the budgets of colleges and universities have ballooned. While it is true that personnel budgets have grown faster than inflation, this is primarily due to the increased cost of healthcare. The real culprit behind most tuition increases at public colleges and universities is a massive decrease in state spending per student. In this post, I will try to illustrate the reality of this for my own institution, the University of Minnesota Duluth.
It is currently Minnesota law that "the state must provide at least 67 percent of the estimated expenditures" for resident undergraduate students, including those from other states such as Wisconsin with which we have a reciprocity agreement (link to statute). There is a cutoff for people who rack up too many credits without graduating, but the law would cover almost all of the current students at UMD.
The actual state contribution is much, much smaller than the law requires. Currently the state provides around 20% of the "O & M" (operations and maintainance) costs for UMD students.
The plots above show, in 2012 inflation-adjusted dollars:How much would that last scenario cost? For UMD, it would cost about $6,750 per student per year. If we use this amount for the whole state, we can estimate the impact on the state budget. Every year about 25,000 MN high school students enter a public university or community college. Let's assume they all eventually get four-year degrees (the "worst"-case scenario from a budgeting point of view, since many do not finish). Then this program would cost approximately $675,000,000 per year. That's a lot, but it isn't a crazy number, considering the current MN higher education budget, excluding loans, is around $200 million.
Thoughtful comments are welcome.

def xy_to_zeta_size(x,y):
return abs(zeta(N(x+I*y)))
cvals = [e^i for i in srange(-7,1,.25)]
cp = contour_plot(xy_to_zeta_size,(-6,3),(-3,3),contours = cvals, fill=False, plot_points = 201)
rzeta(z) = zeta(z)/norm(zeta(z))^(.25)
rzf = fast_callable(rzeta,domain=CDF)
cparg = complex_plot(rzf,(-6,3),(-3,3))
show(cparg+cp,figsize=[18,12])



pk = 3
qk = 23
res = 180
trad = .5
lab = 'tk_' + str(pk) + '_' + str(qk)
def tknot(theta):
return [(2 + trad*cos(qk*theta/pk))*cos(theta), \\
(2 + trad*cos(qk*theta/pk))*sin(theta), trad*sin(qk*theta/pk)]
@parallel(ncpus = 20)
def tknotter(anum):
th = anum*2.0*pi/res
T = Tachyon(xres = 800, yres = 600, camera_center = (4,4,2.5), \\
raydepth=12, antialiasing=2)
loc = tknot(th)
nloc = [abs(x)/norm(vector(loc)) for x in loc]
T.texture('s1',color=nloc,specular=1)
T.texture('p1',color=(.5,.5,.5))
T.sphere(loc,.05,'s1')
ci = 0
for sth in srange(0,th,2*pi/res):
e1 = tknot(sth)
e2 = tknot(sth+2*pi/res)
ts = [abs(x)/norm(vector(e1)) for x in e1]
T.texture('t'+str(ci), color=ts)
T.fcylinder(e1, e2, .025,'t'+str(ci))
ci += 1
T.plane((0,0,-4),(0,0,1),'p1')
T.light((6,6,11),.1,(1,1,1))
T.light((5.9,5.9,11),.1,(1,1,1))
T.save(DATA+lab+'%03d.png'%anum)
return 1
qin = range(pk*res)
s = list(tknotter(qin))
for i in range(40):
r2 = os.system('cp '+DATA+lab+'%03d.png '%(pk*res-1) + DATA+lab+'%03d.png'%(pk*res+i))
anum = qin[-1] + 41
th = anum*2*pi/res
T = Tachyon(xres = 800, yres = 600, camera_center = (5,5,3))
T.save(DATA+lab+'%03d.png'%anum)
import subprocess
subprocess.call('/home/mhampton/ffmpeg/ffmpeg -qmax 2 -i ' + \\
DATA + 'v%3d.png ./t2vest.mp4', shell=True, stdout=file('/dev/null','w'),stderr=file('/dev/null','w'))
