Ah, I had forgotten about that bit of code. Thanks. Next question:
What is 'ct' here? Thanks again, -- Raul On Tue, Mar 1, 2022 at 1:43 PM 'Mike Day' via Programming <programm...@jsoftware.com> wrote: > > No, no acknowledgment expected; my contribution was trivial. > > taskorderu is just an adverbial form of your taskorder with “u” replacing > “cyclotomic” > > Cheers, > > Mike > > Sent from my iPad > > > On 1 Mar 2022, at 17:13, Raul Miller <rauldmil...@gmail.com> wrote: > > > > Yes, pDiv was largely derived from your message. I did not > > specifically credit you on rosettacode because most of what's there > > isn't credited (I try to make an exception when there's an essay in > > our wiki which I can link to (and which I can find). > > > > Anyways... what is 'taskorderu' (or 'taskorder') here? > > > > Thanks, > > > > -- > > Raul > > > > On Tue, Mar 1, 2022 at 11:19 AM 'Michael Day' via Programming > > <programm...@jsoftware.com> wrote: > >> > >> Raul Miller's and RE Boss's (revised) entries here refer: > >> http://rosettacode.org/wiki/Cyclotomic_polynomial#J > >> > >> I think I'm partly responsible for pDiv in this (otherwise!) nicely > >> concise and elegant > >> presentation of J routines to derive these polynomials. > >> Typically, > >> NB. (1+5x+10x^2+10x^3+5x^4+x^5 )%(1+3x+3x^2+x^3) = 1+2x+x^2 > >> 1 5 10 10 5 1 pDiv 1 3 3 1 > >> 1 2 1 > >> > >> pDiv is essentially elementary long division realised for polynomials > >> rather than numbers; > >> it's rather inefficient for high-order polynomials, and I was wondering > >> how to speed it up. > >> I found a paper by Madhu Sudan which addresses fast polynomial division: > >> http://people.csail.mit.edu/madhu/ST12/scribe/lect06.pdf > >> but couldn't understand his hints at an algorithm. I _think_ it > >> successively improves > >> approximations to the solution, working up from a constant term, then > >> modulo x^2, > >> then x^4 , but it's very muddled to my mind, and my mind couldn't see > >> how to set about it! > >> > >> Then I realised a compromise is to exploit polynomial multiplication > >> using Fast Fourier Transforms, > >> as described first for this purpose, I believe, by Roger Hui; Henry's > >> essay is to be found at > >> https://code.jsoftware.com/wiki/Essays/FFT > >> > >> That article desribes polynomial multiplication, where we multiply the > >> ffts of two > >> polynomials extended to an appropriate length, a suitable power of 2. > >> The inverse fft > >> is then applied to yield the required polynomial product. > >> If instead we divide one fft by another, and take the inverse fft, we > >> get the polynomial > >> quotient! > >> > >> So here's a crib of Raul's functions; I've merged cyclotomic and > >> cyclotomic000, dispensing > >> with "cache" and using the memoisation afforded by M. : > >> (OK in fixed width font) > >> > >> ctfft=: {{ assert.0<y > >> if. y = 1 do. _1 1 return. end. > >> 'q p'=. __ q: y > >> if. 1=#q do. > >> ,(y%*/q) {."0 q#1 > >> elseif.2={.q do. > >> ,(y%*/q) {."0 (* 1 _1 $~ #) ct */}.q > >> elseif. 1 e. 1 < p do. > >> ,(y%*/q) {."0 ct */q > >> else. > >> lgl =. {:$ ctlist =. ct "0 }:*/@>,{1,each q NB. ctlist is > >> 2-d table of polynomial divisors > >> lgd =. # dividend =. _1,(-y){.1 NB. (x^n) - 1, > >> and its size > >> lg =. >.&.(2&^.) lgl >. lgd NB. required > >> lengths of all polynomials for fft transforms > >> NB. really, "divisor" is the fft of the divisor! > >> divisor =. */ fft"1 lg{."1 ctlist NB. FFT article > >> doesn't deal with lists of multiplicands > >> unpad roundreal ifft"1 divisor %~ fft lg{.dividend NB. similar to > >> article's multiplication > >> end. > >> }} M. > >> > >> NB. fft, roundreal, ifft from FFT article. > >> > >> NB. Performance - poor for lower orders... > >> NB. taskorderu is adverbial form of taskorder with required verb as left > >> argument. > >> > >> timer'cyclotomic taskorderu 5' NB. timer returns elpased time, > >> before cache/memoisation established! > >> ┌────────┬───────────────────┐ > >> │1.163002│1 105 385 1365 1785│ > >> └────────┴───────────────────┘ > >> timer'ctfft taskorderu 5' NB. not too good here cf cyclotomic! > >> ┌─────────┬───────────────────┐ > >> │3.5719986│1 105 385 1365 1785│ > >> └─────────┴───────────────────┘ > >> NB. continuing with cache/memoisation as above > >> timer'cyclotomic taskorderu 10' > >> ┌───────────┬─────────────────────────────────────────────┐ > >> │5 7.8180008│1 105 385 1365 1785 2805 3135 6545 6545 10465│ > >> └───────────┴─────────────────────────────────────────────┘ > >> timer'ctfft taskorderu 10' NB. some improvement! > >> ┌────────┬─────────────────────────────────────────────┐ > >> │3 52.945│1 105 385 1365 1785 2805 3135 6545 6545 10465│ > >> └────────┴─────────────────────────────────────────────┘ > >> > >> So - not an order of magnitude effect, but of some interest, I hope! > >> > >> Mike > >> > >>> On 20/02/2022 18:32, Raul Miller wrote: > >>> Oh, bleah... of course. > >>> > >>> y does not change. So that should be a test on {.x -- and that reveals > >>> that I was using the wrong values throughout that section of code. > >>> > >>> Here's a fixed version: > >>> > >>> pDiv=: {{ > >>> q=. $j=. 2 + x -&# y > >>> 'x y'=. x,:y > >>> while. j=. j-1 do. > >>> if. 0={.x do. j=. j-<:i=. 0 i.~ 0=x > >>> q=. q,i#0 > >>> x=. i |.!.0 x > >>> else. > >>> q=. q, r=. x %&{. y > >>> x=. 1 |.!.0 x - y*r > >>> end. > >>> end.q > >>> }} > >>> > >>> Thanks, > >> > >> > >> -- > >> This email has been checked for viruses by Avast antivirus software. > >> https://www.avast.com/antivirus > >> > >> ---------------------------------------------------------------------- > >> For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm