<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<font face="Helvetica, Arial, sans-serif">Hi,<br>
<br>
please disregard my comment on <b>bif_floor()</b> below.<br>
<br>
The proper line should be this (note the <font face="Courier New,
Courier, monospace"><b>-</b></font> instead of <font
face="Courier New, Courier, monospace"><b>+</b></font>):<br>
</font><br>
<font face="Helvetica, Arial, sans-serif"><font face="Courier New,
Courier, monospace"><b>if (D < 1.0 - Workspace::get_CT())
return zv(Z, fr, fi);<br>
<br>
</b><font face="Helvetica, Arial, sans-serif">With that change
my testcases (which contain the examples of both the ISO
standard and<br>
the IBM language reference) are now properly working again.
Fixed in <b>SVN 970</b>.<br>
<br>
/// Jürgen<br>
<br>
</font><b><br>
</b></font></font>
<div class="moz-cite-prefix">On 06/23/2017 09:02 PM, Juergen
Sauermann wrote:<br>
</div>
<blockquote
cite="mid:a8574933-7e73-d88e-95c2-***@t-online.de"
type="cite">
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<font face="Helvetica, Arial, sans-serif">Hi Frederick,<br>
<br>
I suppose that this is caused by a rounding error just before
the complex floor.<br>
I have attached a debug version of <b>ComplexCell.cc</b> that
prints every partial result of the computation.<br>
<br>
If I run it then I get:<br>
<br>
<font face="Courier New, Courier, monospace"><b> 5J3 | 14J5</b><b><br>
</b><b>modulus (A) is: (5,3)</b><b><br>
</b><b>A=0 is: (0,0)</b><b><br>
</b><b>A+A=0 is: (5,3)</b><b><br>
</b><b>B÷A+A=0 is: (2.5,-0.5)</b><b><br>
</b><b>⌊B÷A+A=0 is: (3,-1)</b><b><br>
</b><b>A×⌊B÷A+A=0 is: (18,4)</b><b><br>
</b><b>B-A×⌊B÷A+A=0 is: (-4,1)</b><b><br>
</b><b>¯4J1</b></font><br>
<br>
However if I use a slightly smaller <b>B</b> (kind of
simulating a rounding error) then I get:<br>
<br>
<font face="Courier New, Courier, monospace"><b> 5J3 |
14J4.999999999</b><b><br>
</b><b>modulus (A) is: (5,3)</b><b><br>
</b><b>A=0 is: (0,0)</b><b><br>
</b><b>A+A=0 is: (5,3)</b><b><br>
</b><b>B÷A+A=0 is: (2.4999999999118,-0.50000000014706)</b><b><br>
</b><b>⌊B÷A+A=0 is: (2,-1)</b><b><br>
</b><b>A×⌊B÷A+A=0 is: (13,1)</b><b><br>
</b><b>B-A×⌊B÷A+A=0 is: (1,3.999999999)</b><b><br>
</b><b>1J3.999999999</b></font><br>
<br>
I suppose that is what happens on your machine but not on mine.<br>
<br>
<br>
You may also want to try out the following. In <b>ComplexCell::bif_floor()</b>
around line <b>23</b><b>1 ff</b> it says:<br>
<br>
<font face="Courier New, Courier, monospace"><b> // ISO: if D
is tolerantly less than 1 return fr + 0J1×fi</b><b><br>
</b><b> // IBM: if D is less than 1 return fr +
0J1×fi</b><b><br>
</b><b> // However, ISO examples follow IBM (and so do we)</b><b><br>
</b><b> //</b><b><br>
</b><b>// if (D < 1.0 + Workspace::get_CT()) return zv(Z,
fr, fi); // ISO</b><b><br>
</b><b> if (D < 1.0) return zv(Z, fr, fi); // IBM
and examples in ISO</b><b><br>
</b></font><br>
If you uncomment the first if statement then you get the ISO
variant of <b>bif_floor() </b>while otherwise you<br>
get the IBM variant (which is also the one described in the
McDonnel paper). It could be that the ISO variant<br>
works better for the <b>bif_residue()</b> function, but it
causes problems in other places. If uncommenting the <b>if</b><br>
line should fix your problem, then I can create two variants of
<b>bif_floor()</b>: one for <b>bif_residue()</b> and one<br>
for the rest.<br>
<br>
Best Regards,<br>
Jürgen Sauermann<br>
<br>
</font><br>
<div class="moz-cite-prefix">On 06/23/2017 07:31 PM, Frederick
Pitts wrote:<br>
</div>
<blockquote cite="mid:***@comcast.net"
type="cite">
<meta content="text/html; charset=utf-8"
http-equiv="Content-Type">
<div><span style="font-family: Helvetica, Arial, sans-serif;">Hello
Jürgen,</span></div>
<div><span style="font-family: Helvetica, Arial, sans-serif;"><br>
</span></div>
<div><span style="font-family: Helvetica, Arial, sans-serif;">
SVN 969 on my platform (Fedora 25, </span>Intel(R) Core(TM)
i7-6700 CPU) </div>
<blockquote type="cite"> </blockquote>
<div><span style="font-family: Helvetica, Arial, sans-serif;"><br>
</span></div>
<span style="font-family: Helvetica, Arial, sans-serif;"> 5J3
| 14J5 1J4 ¯4J1</span>
<div><font face="Helvetica, Arial, sans-serif"><br>
</font></div>
<div><font face="Helvetica, Arial, sans-serif">gives</font></div>
<div><font face="Helvetica, Arial, sans-serif"><br>
</font>
<div><span style="font-family: Helvetica, Arial, sans-serif;">1J4
¯4J1 ¯4J1</span></div>
<div><font face="Helvetica, Arial, sans-serif"><br>
</font></div>
<div><font face="Helvetica, Arial, sans-serif">not</font></div>
<div><font face="Helvetica, Arial, sans-serif"><br>
</font></div>
<div>¯<span style="font-family: Helvetica, Arial, sans-serif;">1J4
¯4J1 ¯4J1</span></div>
<div><font face="Helvetica, Arial, sans-serif"><br>
</font></div>
<div><font face="Helvetica, Arial, sans-serif">Regards,</font></div>
<div><font face="Helvetica, Arial, sans-serif"><br>
</font></div>
<div><font face="Helvetica, Arial, sans-serif">Fred<br>
</font>
<div><br>
</div>
<div>On Fri, 2017-06-23 at 17:38 +0200, Juergen Sauermann
wrote:</div>
<blockquote type="cite"> <font face="Helvetica, Arial,
sans-serif">Hi,<br>
<br>
I have changed <b>A∣B</b> to literally follow the paper
pointed out by Jay.<br>
The complex floor itself was already implemented like
described in the paper,<br>
but <b>A</b><b>∣</b><b>B</b> was not.<br>
<br>
Now (<b>SVN 969</b>) the complex <b>A∣B</b> is computed
as<br>
<br>
<font face="Courier New, Courier, monospace"><b>Z←B-A×⌊B÷A+A=0</b></font><br>
<br>
without any attempts to improve the performance of the
operation.<br>
<br>
The result in the <b>5J3 </b>modulus are now the same
as in IBM APL2 (and I suppose also in J)<br>
<br>
<font face="Courier New, Courier, monospace"><b>
5J3 ∣ 14J5 1J4 ¯4J1 </b><b><br>
</b><b>¯4J1 ¯4J1 ¯4J1</b></font><br>
<br>
I hope this finally fixed it. Thanks a lot to all that
helped fixing this bug.<br>
<br>
/// Jürgen<br>
</font><br>
<br>
<div class="moz-cite-prefix">On 06/23/2017 09:34 AM, Jay
Foad wrote:<br>
</div>
<blockquote
cite="mid:CANd1uZnA3KXJB8-=***@mail.gmail.com"
type="cite">
<div dir="ltr">I urge you to read Eugene McDonnell's <a
moz-do-not-send="true"
href="http://www.jsoftware.com/papers/eem/complexfloor.htm">Complex
Floor</a>, which also discusses Residue. I believe
the design he comes up with in this paper was adopted
more or less verbatim in APL. Also bear in mind that
Floor and Residue in APL have to work well on all
complex numbers, not <i>just</i> the Gaussian
integers.
<div><br>
</div>
<div>Jay.</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On 23 June 2017 at 01:42,
Frederick Pitts <span dir="ltr"><<a
moz-do-not-send="true"
href="mailto:***@comcast.net"
target="_blank">***@comcast.net</a>></span>
wrote:<br>
<blockquote type="cite">
<div>
<div>Hello Jürgen,</div>
<div><br>
</div>
<div> Some observations:</div>
<div><br>
</div>
<div>1) When performing a residue calculation on
positive integers, a straight-forward integer
division with remainder calculation</div>
<div>suffices. For example, 5 ∣ 13 is computed
with 13 / 5 = 2 r 3 and so 5 ∣ 13 = 3 where 3
is in the complete residue system</div>
<div>{ 0, 1, 2, 3, 4 }. When performing the
calculation on negative integers, one has to
take advantage of the fact that the</div>
<div>integer division quotient and remainder are
not unique in order to compute a residue that
is in the complete residue system.</div>
<div>For 5 ∣ ¯13, ¯13 / 5 = ¯2 r ¯3 where ¯3 is
not in the CRS. However, ¯13 / 5 = ¯3 r 2
where 3 is in the CSR. The same concept
applies Gaussian integers.</div>
<div><br>
</div>
<div>2) I suspect the decision to have the APL2
floor function round toward negative infinity,
instead of toward zero,</div>
<div>was made based on the desire to save cpu
cycles and memory in the residue function
code.</div>
<div><br>
</div>
<div>3) I read at least one math literature
article discussing Gaussian integer Euclidean
division algorithms, that recommended</div>
<div>rounding down to the nearest real and
imaginary part toward negative infinity.
Unfortunately I cannot find</div>
<div>the article right now. I will continue to
look for it. None of the articles discussed
using a complex integer floor function.</div>
<div><br>
</div>
<div>4) The reason MOD_TEST.apl shows total
disagreement MODJ and the builtin residue
function is that the complex floor function
code change in SVN 965 relocated the CRS's on
complex plane. Attached are
CRS0-CRS1-6J-6-SVN964.out</div>
<div>CRS0-CRS1-6J-6-SVN965.out. The first file
contains a CRS map for modulus ¯6J¯6 produced
with the residue function</div>
<div>followed by a map for the same modulus
produced with MODJ using SVN 964. The second
file contains the same maps</div>
<div>using SVN 965. Observe that for SVN 964 the
residue function CRS is in the bottom half of
the complex plane, but for SVN 965 it is in
the top half. The CRS for the MODJ function is
in the bottom half in both SVN cases.</div>
<div>5)The complex floor code change did not
help with the issue that the builtin residue
function is not idempotent for all possible
arguments and consequently generates too many
residues. See attached CRSOTST0-SVN965.out.
For a grid</div>
<div>of Gaussian integers with real and
imaginary parts ranging from ¯15 to 15, using
every value with every other value as modulus
and second argument, there were 40 case where
the order of CSR exceeded the modulus norm. I
think that</div>
<div>was the failure count with the previous
SVN.</div>
<div><br>
</div>
<div> Sincerely, I think the complex floor and
ceiling functions should not be used by other
functions even if IBM and ISO</div>
<div>imply they are in their documentations. I'm
not seeing them used in the Gaussian integer
literature. Again, please correct me if I'm
wrong.</div>
<div><br>
</div>
<div>Regards,</div>
<div><br>
</div>
<div>Fred</div>
<div>
<div class="h5">
<div><br>
</div>
<div>On Thu, 2017-06-22 at 18:08 +0200,
Juergen Sauermann wrote:</div>
<blockquote type="cite"> Hi again,<br>
<br>
sorry a small typo below. Lines 19/20
should read:<br>
<br>
<b> (¯6J¯5 - 0J¯11) ÷ ¯6J¯6 </b><b><br>
</b><b>0J¯1</b><b><br>
</b><br>
/// Jürgen<br>
<br>
<div
class="m_5990767214693122393moz-cite-prefix">On
06/22/2017 05:44 PM, Juergen Sauermann
wrote:<br>
</div>
<blockquote type="cite"> <font
face="Helvetica, Arial, sans-serif">Hi
Fred at al.,<br>
<br>
I have made another attempt to fix the
residue function, <b>SVN 965</b>.<br>
<br>
For complex <b>m∣b</b> It now rounds
down the real() and imag() parts of
the quotient <b>q←b÷m</b> and returns
<b>b-q</b>.<br>
Instead of always rounding towards 0
or -infinity, the rounding direction
is now (compared to the previous<br>
attempt) determined by the quadrant in
which the modulus <b>m</b> lies.<br>
</font><br>
There are still differences to the
results displayed by <font
face="Helvetica, Arial, sans-serif"><b>MOD_test.apl</b>,
but I suppose they are<br>
caused by that program. For example,
the first line of </font><font
face="Helvetica, Arial, sans-serif"><font
face="Helvetica, Arial, sans-serif"><b>MOD_test.apl</b>,
says:<br>
<br>
</font><font face="Courier New,
Courier, monospace"><b> LA RA
MODJ |</b><b><br>
</b><b>¯6J¯6 ¯6J¯5 0J¯11 0J1</b><br>
</font><br>
We have:<br>
<br>
<b> (¯6J¯5 - 0J1) ÷ ¯6J¯6 </b><b><br>
</b><b>1</b><b><br>
</b><b> (0J¯11 - 0J1) ÷ ¯6J¯6</b><b><br>
</b><b>1J1</b><br>
<br>
so both <b>0J¯11</b> and <b>0J1</b>
are valid remainders modulo <b>¯6J¯6</b>.
However, the<br>
magnitude of </font><font
face="Helvetica, Arial, sans-serif"><b>0J¯11</b>
(= <b>11</b>) is larger than the
magnitude of the divisor </font><font
face="Helvetica, Arial, sans-serif"><b><font
face="Helvetica, Arial,
sans-serif"><b>¯6J¯6</b></font></b><font
face="Helvetica, Arial, sans-serif">
(= around <b>8.4</b>).<br>
I suppose most people expect the
remainder of a division to be in
some sense<br>
smaller than the divisor.<br>
<br>
Regarding Jay's idempotency
requirement we now have:<br>
<br>
<b><font face="Courier New,
Courier, monospace">
f←{6J6|⍵}<br>
f ¯3 ¯2 ¯3 ¯1 0 1 2 3<br>
3J6 4J6 3J6 5J6 0 ¯5J6 ¯4J6 ¯3J6<br>
f f ¯3 ¯2 ¯3 ¯1 0 1 2 3<br>
3J6 4J6 3J6 5J6 0 ¯5J6 ¯4J6 ¯3J6</font></b><br>
<b><font face="Courier New, Courier,
monospace"><br>
f←{5J3|⍵}<br>
f ¯3 ¯2 ¯3 ¯1 0 1 2 3<br>
2J3 3J3 2J3 4J3 0 ¯2J5 ¯1J5 0J5<br>
f f ¯3 ¯2 ¯3 ¯1 0 1 2 3<br>
2J3 3J3 2J3 4J3 0 ¯2J5 ¯1J5 0J5<br>
</font></b><br>
so at least the first modulus seems
to work as well. The result is still
different<br>
from APL2 as reported by Jay, but I
can't tell why:<br>
<br>
IBM APL2:<br>
<br>
<font face="Courier New, Courier,
monospace"><b> 5J3 ∣ 14J5 1J4
¯4J1</b></font></font></font><br>
<font face="Helvetica, Arial,
sans-serif"><font face="Helvetica,
Arial, sans-serif"><font
face="Courier New, Courier,
monospace"><b>¯4J1 </b></font></font></font><font
face="Helvetica, Arial, sans-serif"><font
face="Helvetica, Arial, sans-serif"><font
face="Courier New, Courier,
monospace"><b>¯4J1 </b></font></font></font><font
face="Helvetica, Arial, sans-serif"><font
face="Helvetica, Arial, sans-serif"><font
face="Courier New, Courier,
monospace"><b>¯4J1<br>
<br>
</b></font></font></font>GNU APL:<br>
<br>
<font face="Helvetica, Arial,
sans-serif"><font face="Helvetica,
Arial, sans-serif"><font
face="Helvetica, Arial,
sans-serif"><font face="Helvetica,
Arial, sans-serif"><font
face="Courier New, Courier,
monospace"><b> 5J3 ∣ 14J5
1J4 ¯4J1 </b><b><br>
</b><b>1J4 1J4 1J4</b></font><br>
<br>
</font></font>But both <b>1J4</b>
and <b>¯4J1</b> are valid
remainders. Interestingly Jay's
idempotency requirement seems to<br>
be fulfilled by both the GNU APL and
by IBM APL2, so that that
requirement alone does not suffice<br>
to tell which result is correct.<br>
<br>
On the other hand this matter seems
to be like discussing if the square
root of 4 is 2 or -2 with<br>
both answers being correct.<br>
<br>
Best Regards,<br>
Jürgen Sauermann<br>
<br>
<br>
</font><b><font face="Helvetica,
Arial, sans-serif"><br>
</font></b> </font>
<div
class="m_5990767214693122393moz-cite-prefix">On
06/21/2017 10:25 PM, Frederick Pitts
wrote:<br>
</div>
<blockquote type="cite">
<div>Jürgen,</div>
<div><br>
</div>
<div> The proposed change to DIVJ does
not work because 'q1' is a complex
number, so the '×' in '× q1' is the
complex complement function, not the
sign function. I tried the proposed
change and every test fails.</div>
<div><br>
</div>
<div> I will try to hack DIVJ to use a
floor towards zero instead of
towards minus infinity for the real
and imaginary</div>
<div>parts of the quotient and see
what happens.</div>
<div><br>
</div>
<div> Correct me if I am wrong, but my
mind set is that the APL residue
function has to satisfy the
following invariants:</div>
<div>1) The order of the complete
residue system (residue count) for a
given modulo 'n' has to equal the
norm of 'n'.</div>
<div>2) And as Jay Foad so succinctly
expressed it, the residue function
has to be idempotent with respect to
its right argument,</div>
<div> e.g., ( n | m ) = n | n | m .</div>
<div>regardless of the implementation
of the residue function.</div>
<div><br>
</div>
<div>Later,</div>
<div><br>
</div>
<div>Fred </div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div><br>
</div>
<div>On Wed, 2017-06-21 at 19:46
+0200, Juergen Sauermann wrote:</div>
<blockquote type="cite"> <font
face="Helvetica, Arial,
sans-serif">Hi Fred,<br>
<br>
I have a question about the <b>MOD_test.apl</b>
that you kindly provided.<br>
<br>
In function <b>DIVJ</b> on line
57 ff it says:<br>
<br>
<font face="Courier New, Courier,
monospace"><b>z ← q , a - b × q
← CMPLX ⌊ ( 9 11 ) ○ a ÷ b</b></font><br>
<br>
so the quotient is rounded down
towards minus infinity.<br>
<br>
I wonder if that should be
something like<br>
<br>
<font face="Courier New, Courier,
monospace"><b>z ← q , (× q1) × a
- b × q ← CMPLX ⌊ ∣ 9 11 ○ q1
← a ÷ b</b></font><br>
<br>
so that the quotient is rounded
towards 0? Interestingly IBM and
ISO<br>
give different definitions for the
residue in terms of APL:<br>
<br>
IBM (language reference, page
227):<br>
<font face="Courier New, Courier,
monospace"><b>Z←L∣R</b><b><br>
</b><b>Z is R</b><b>-</b><b>L×⌊
R÷L+L=0</b></font><br>
<br>
ISO (chapter 7.2.9 Residue): <br>
<font face="Courier New, Courier,
monospace"><b>R←Q∣P</b><b><br>
</b><b>R←P-(×P)×|Q×⌊|P÷Q<br>
and return R if (×R)=×Q, or
R+Q<br>
otherwise.<br>
</b></font> </font><br>
That suggest that IBM rounds the
quotient down towards minus infinity
while ISO rounds<br>
towards 0.<br>
<br>
My naive view on remainder is that
the nearest integer quotient shall
be smaller in<br>
magnitude and not smaller in value.
Regarding your proposal (which is
different from<br>
both IBM and ISO) my concern is that
may lead to different results for <b>modulo
N</b> and<br>
<b>modulo</b> <b>N×1J0</b><br>
<br>
Best Regards,<br>
Jürgen Sauermann<br>
<br>
<br>
<div
class="m_5990767214693122393moz-cite-prefix">On
06/21/2017 03:08 AM, Frederick
Pitts wrote:<br>
</div>
<blockquote type="cite">
<div><span
style="white-space:normal">Jürgen,</span></div>
<div><span
style="white-space:normal"><br>
</span></div>
<div><span
style="white-space:normal">
This message is being resent
because last minute changes I
made to CRS0.apl and CRS1.apl
do not output the</span></div>
<div><span
style="white-space:normal">data
I intended. This message has
corrected versions of those
files attached. Please
discard the old CRS0.apl and
CRS1.apl files. The first
line of output is the modulo
basis, </span><span
style="white-space:normal">the
second line is the calculated
complete residue system values
and the third line is the
number of residues in the CRS </span><span
style="white-space:normal">on
the previous line.</span></div>
<div><span
style="white-space:normal"><br>
</span></div>
<div><span
style="white-space:normal">
CRSOTST0.apl and CRSOTST1.apl
are unchanged.</span></div>
<div><span
style="white-space:normal"><br>
</span></div>
<div><span
style="white-space:normal">
Also please find attached
MOD_TEST.apl which compares
the residues calculated by
MODJ and the builtin residue
function and reports
discrepancies. The first
column of output is the modulo
basis, the second column the
right argument to the
functions, the third column
the MODJ result and the fourth
column is the builtin residue
function result.</span></div>
<div><span
style="white-space:normal"><br>
</span></div>
<div><span
style="white-space:normal">Regards</span></div>
<div><span
style="white-space:normal"><br>
</span></div>
<div><span
style="white-space:normal">Fred</span></div>
<div><br>
</div>
<div>Hello Jürgen,</div>
<pre> SVN 964 moved us in the right direction but not completely out of the</pre>
<pre>woods. SVN 964 still exhibits errors. For instance</pre>
<pre> 2J6 | 5J5</pre>
<pre>¯1J7</pre>
<pre> 2J6 | ¯1J7</pre>
<pre>¯3J1</pre>
<pre> 2J6 | ¯3J1</pre>
<pre>¯3J1</pre>
<pre> I found this and previous residue function errors using the attached APL</pre>
<pre>code files. The files with base name ending in '0' use the builtin residue</pre>
<pre>function. Those with base name ending in '1' use a residue function implemented</pre>
<pre>in APL. The files with base name beginning with 'CRSOTST' test if the order of</pre>
<pre>the complete residue system (CRS) equals the norm of the modulo basis. That</pre>
<pre>test fails for several modulo bases, 2J6 being one of them, using the builtin</pre>
<pre>residue function. No errors are detected with the APL implementation. The other files</pre>
<pre>can be used to plot the CRS for a given modulo basis where 'a' and 'b' in</pre>
<pre>'a + b * i' are limited to +15 to -15 range. A full screen terminal window is</pre>
<pre>needed to see the plot.</pre>
<pre> My APL implementation of the residue function is very close to what you</pre>
<pre>described in your previous email. Maybe comparing the two implementations will</pre>
<pre>give insight into why the builtin residue function fails for some modulo bases.</pre>
<pre> I make no assertion that my implementation is correct in all</pre>
<pre>aspects.</pre>
<pre>Regards,</pre>
<pre>Fred</pre>
<div>On Tue, 2017-06-20 at 14:14
+0200, Juergen Sauermann wrote:</div>
<blockquote type="cite"> <font
face="Helvetica, Arial,
sans-serif">Hi Frederick,<br>
<br>
the algorithm for <b>A ∣ B</b>
used in GNU APL is this:<br>
<br>
<font face="Courier New,
Courier, monospace"><b>-
compute the quotient Q</b><b>←</b><b>B÷A,</b><b><br>
</b><b>- "round down" Q to
the next (complex) integer</b><b>
Q1,</b><b><br>
</b><b>- return B - Q1×A</b></font><b><br>
</b><br>
Now the problem seems to be
what is meant by "round down".
There are two candidates:<br>
<br>
<font face="Courier New,
Courier, monospace"> <b>Q1
← ⌊
Q <wbr>
i.e. use APL floor</b><b>
to round down Q</b><b><br>
</b><b> Q1 ← Complex(
floor(Q.real(), </b></font></font><font
face="Helvetica, Arial,
sans-serif"><font
face="Courier New, Courier,
monospace"><b>floor(Q.</b><b>imag</b><b>())
) </b><b>i,e, use C/C++
floor() to round down Q.</b><b><br>
</b></font><br>
In your <b>5J3 ∣ 14J5</b>
example, the quotient is <b>2.5J¯0.5</b>,
which gives different results
for the APL floor <b>⌊</b>
and the C/C++ floor().<br>
<br>
The APL floor <font
face="Courier New, Courier,
monospace"><b>⌊</b></font></font><font
face="Helvetica, Arial,
sans-serif"><font
face="Helvetica, Arial,
sans-serif"><font
face="Courier New,
Courier, monospace"><b>2.5J¯0.5</b></font>
is </font><font
face="Courier New, Courier,
monospace"><b>3J¯1</b></font>
(a somewhat dubious invention
in the ISO standard on page
19, which I used up to<br>
including <b>SVN 963</b>),
while the C/C++ floor() is</font><font
face="Helvetica, Arial,
sans-serif"><font
face="Helvetica, Arial,
sans-serif"><font
face="Courier New,
Courier, monospace"><b>
2J¯1</b></font></font>.
The difference between the APL
floor and the C/C++ floor is <b>1.0
</b>which,<br>
multiplied by the divisor,
explains the differences that
we see.<br>
<br>
As of <b>SVN 964</b> I have
changed the residue function (<b>∣</b>)
to use the C/C++ floor instead
of the APL floor. The APL
floor and<br>
Ceiling functions (<b>⌊</b>
and <b>⌈</b>) are still using
the apparently broken
definition in the ISO
standard.<br>
<br>
I hope this works better for
you. At least I am getting
this in <b>SVN 964</b>:<br>
<br>
<font face="Courier New,
Courier, monospace"><b>
5J3 | 14J5</b><b><br>
</b><b>1J4</b><b><br>
</b><b> 5J3 | 1J4</b><b><br>
</b><b>1J4</b></font><b><br>
</b><br>
whereas <b>SVN 963</b> was
giving:<br>
<br>
<font face="Courier New,
Courier, monospace"><b>
5J3 | 14J5</b><b><br>
</b><b>¯4J1</b><b><br>
</b><b> 5J3 | 1J4</b><b><br>
</b><b>¯4J1</b></font><br>
<br>
<br>
Best Regards,<br>
/// Jürgen<br>
<br>
</font><br>
<br>
<div
class="m_5990767214693122393moz-cite-prefix">On
06/19/2017 07:03 PM, Frederick
Pitts wrote:<br>
</div>
<blockquote type="cite">
<pre>Jürgen,
With gnu apl (svn 961 on Fedora 25, Intel(R) Core(TM) i7-6700
CPU), the residue function (∣) yields the following:
5J3 ∣ 14J5
1J4
5J3 | 1J4
¯4J1
5J3 | ¯4J1
¯4J1
The above result means that two elements in the complete residue system
(CSR) for mod 5J3 are equal, i.e. 1J4 = ¯4J1 mod 5J3, which is not
allowed. None of the elements of a CSR can be equal modulo the CSR's
basis.
Regards,
Fred
</pre>
</blockquote>
<br>
</blockquote>
</blockquote>
<br>
</blockquote>
</blockquote>
<br>
</blockquote>
<br>
</blockquote>
</div>
</div>
</div>
<br>
</blockquote>
</div>
<br>
</div>
</blockquote>
<br>
</blockquote>
</div>
</div>
</blockquote>
<br>
</blockquote>
<br>
</body>
</html>