visualization - Number of divisors visualized with the QPochhammer function, how to improve performance of code?
I have this code that is originally Jeffrey Stopple's code for the Riemann zeta function in the complex plane. Because I discovered yesterday that the number of divisors can be generated with the $q$-Pochhammer symbol (QPochhammer
), and since Mathematica shows a plot of QPochhammer
, I thought that plotting it would be fun.
Here is the code that needs improvement:
Show[Graphics[RasterArray[
Table[Hue[Mod[3 Pi/2 +
Arg[Sum[(s + I t)^(n - 1)*(QPochhammer[(s + I t)^(n + 1), (s + I t)]/
QPochhammer[(s + I t)^(n), (s + I t)]), {n, 1, 100}]],
2 Pi]/(2 Pi)], {t, -1.1, 1.1, .05}, {s, -1.1, 1.1, .05}]]],
AspectRatio -> Automatic]
And the code for the number of divisors:
CoefficientList[
Series[Sum[
x^(n - 1)*(QPochhammer[x^(n + 1), x]/QPochhammer[x^(n), x]), {n, 1,
104}], {x, 0, 103}], x] (*_ Mats Granvik_,Jan 03 2015*)
1, 2, 2, 3, 2, 4, 2, 4, 3, 4, 2, 6, 2, 4, 4, 5, 2, 6, 2, 6, 4, 4, 2, 8, 3, 4, 4,
6, 2, 8, 2, 6, 4, 4, 4, 9, 2, 4, 4, 8, 2, 8, 2, 6, 6, 4, 2, 10, 3, 6, 4, 6, 2, 8,
4, 8, 4, 4, 2, 12, 2, 4, 6, 7, 4, 8, 2, 6, 4, 8, 2,...
The plot from the first program that I would like to improve:
Already if someone could post a plot with higher resolution, I would be glad. My computer is rather old.
Answer
It looks like you want to plot the phase-only information of a complex function. Using the following helper functions for plotting the phase-only information complex functions:
hue = Compile[{{z, _Complex}}, {Mod[3 π/2 + Arg[z],
2 π]/(2 π), 1, If[Abs[z] > 10^-3, 1, 0]},
CompilationTarget -> "C", RuntimeAttributes -> {Listable}];
ComplexPlotC[f_, {x0_, x1_, δx_}, {y0_, y1_, δy_}] :=
Image[hue[
f[Outer[Complex, Range[x0, x1, δx],
Range[y1, y0, -δy]]]]\[Transpose], ColorSpace -> Hue,
Magnification -> 1];
CCompileC[expr_] :=
Compile[{{z, _Complex}}, Evaluate[expr], CompilationTarget -> "C",
RuntimeAttributes -> {Listable}];
You can then compile your function and plot it (I'll only sum 10 terms, rather than 100, as using 100 would take quite a long time):
func = CCompileC[
If[Abs[z] >= 0.999, 0,
Sum[z^(n - 1)*(QPochhammer[z^(n + 1), z]/
QPochhammer[z^(n), z]), {n, 1, 10}]]];
ComplexPlotC[func, {-1 + 10^-6 RandomReal[], 1,
0.003}, {-1 + 10^-6 RandomReal[], 1, 0.003}]
which gives the following:
Here is a 100-term sum picture (open in separate tab to see slightly larger picture):
Comments
Post a Comment