How does the square end?

20

2

In Base-10, all perfect squares end in 0, 1, 4, 5, 6, or 9.

In Base-16, all perfect squares end in 0, 1, 4, or 9.

Nilknarf describes why this is and how to work this out very well in this answer, but I'll also give a brief description here:

When squaring a Base-10 number, N, the "ones" digit is not affected by what's in the "tens" digit, or the "hundreds" digit, and so on. Only the "ones" digit in N affects the "ones" digit in N2, so an easy (but maybe not golfiest) way to find all possible last digits for N2 is to find n2 mod 10 for all 0 <= n < 10. Each result is a possible last digit. For Base-m, you could find n2 mod m for all 0 <= n < m.

Write a program which, when given the input N, outputs all possible last digits for a perfect square in Base-N (without duplicates). You may assume N is greater than 0, and that N is small enough that N2 won't overflow (If you can test all the way up to N2, I'll give you a finite amount of brownie points, but know that the exchange rate of brownie points to real points is infinity to one).

Tests:

 Input -> Output
 1     -> 0
 2     -> 0,1
 10    -> 0,1,5,6,4,9
 16    -> 0,1,4,9
 31    -> 0,1,2,4,5,7,8,9,10,14,16,18,19,20,25,28
 120   -> 0,1,4,9,16,24,25,36,40,49,60,64,76,81,84,96,100,105

this is , so standard rules apply!

(If you find this too easy, or you want a more in-depth question on the topic, consider this question: Minimal cover of bases for quadratic residue testing of squareness).

Lord Farquaad

Posted 2017-07-27T13:35:50.400

Reputation: 1 513

1Does the output array need to be sorted? – Shaggy – 2017-07-27T13:41:05.233

@Shaggy Nope! Mego, Duplication is not allowed. Theoretically, N could be enormous, so duplicates would make the output pretty unreadable. I'll adit the question – Lord Farquaad – 2017-07-27T13:41:43.087

Is outputting a set acceptable? – totallyhuman – 2017-07-27T13:47:09.307

2@totallyhuman Why wouldn't it be valid? Sets are unordered collections and it must not be sorted, so... – Mr. Xcoder – 2017-07-27T13:47:54.163

Answers

8

Jelly, 5 bytes

R²%³Q

Try it online!

Explanation

R²%³Q   Main link, argument: n

R       Range from 1 to n
 ²      Square each
  %³    Mod each by n
    Q   Deduplicate

Business Cat

Posted 2017-07-27T13:35:50.400

Reputation: 8 927

19

Google Sheets, 52 51 47 bytes

=ArrayFormula(Join(",",Unique(Mod(Row(A:A)^2,A1

Saved 4 bytes thanks to Taylor Scott

Sheets will automatically add 4 closing parentheses to the end of the formula.

It doesn't return the results in ascending order but it does return the correct results.

Results

Engineer Toast

Posted 2017-07-27T13:35:50.400

Reputation: 5 769

Holy cow, man that is fricken killer! Who would’ve thought? +1 – bearacuda13 – 2017-07-27T22:14:46.883

1This is definitely my favorite answer so far. – Lord Farquaad – 2017-07-28T13:24:30.640

@LordFarquaad I am surprised and pleased this was so well received. I've been trying to golf more in Sheets and Excel even though - and partially because - they have such limited ranges. It's led to a lot of array formulas. – Engineer Toast – 2017-07-30T01:40:52.263

You should be able to drop the terminating )s for -4 bytes – Taylor Scott – 2017-09-05T16:10:36.417

@TaylorScott Thanks! I saw that trick somewhere recently - probably on one of your answers - and need to remember to start using it. – Engineer Toast – 2017-09-05T17:04:28.633

6

05AB1E, 5 bytes

Lns%ê

Try it online! or as a Test Suite

L     # Range 1 .. input
 n    # Square each
  s%  # Mod by input
    ê # Uniquify (also sorts as a bonus)

Riley

Posted 2017-07-27T13:35:50.400

Reputation: 11 345

How does s work here? Is the input repeated? – Luis Mendo – 2017-07-27T14:05:14.690

@LuisMendo s is pop a,b; push b,a. When a command tries to pop something from the stack and there isn't anything left the next input is used. If there isn't any more input the last input is used (here is an example). In this case I could have used ¹ which pushes the first input, but s works better for the test suite.

– Riley – 2017-07-27T14:09:03.087

Thanks. Do you have more info regarding the criterion for which input gets reused? (if there have been say three inputs and you try to pop two values from an empty stack)? – Luis Mendo – 2017-07-27T14:13:35.007

1@LuisMendo Input is used in order until it runs out, then it continues to use the last element. You could imagine it like the stack was padded with each input in order and an infinite number of the last element. – Riley – 2017-07-27T14:16:47.573

@LuisMendo Ln¹%ê is equivalent here. s. – Magic Octopus Urn – 2017-07-27T16:28:26.060

6

Swift, 47 35 32* bytes

* -3 thanks to @Alexander.

Possibly the first time in history Swift ties beats Python?

{m in Set((0..<m).map{$0*$0%m})}

Try it online!


Explanation

  • (0..<m).map{} - Iterates through the range [0...m) and map the following results:

  • $0*$0%m - The square of each integer modulo the base m.

  • Set(...) - Removes the duplicates.

  • m in - Assigns the base to a variable m

Mr. Xcoder

Posted 2017-07-27T13:35:50.400

Reputation: 39 774

Username checks out... wait a second. – Rohan Jhunjhunwala – 2017-07-28T02:50:06.630

1More like it beats Python. That is impressive! I thought I would never see the day that would happen. – Caleb Kleveter – 2017-07-28T17:56:19.783

@CalebKleveter Thanks! I'm glad you found it impressive :) – Mr. Xcoder – 2017-07-28T21:29:49.037

3

Japt, 7 6 bytes

Dz%UÃâ

Test it

1 byte saved thanks to Oliver


Explanation

Implicit input of integer U.

Ç   Ã

Create an array of integers from 0 to U-1, inclusive and pass each though a function.

²

Square.

%U

Modulo U.

â

Get all unique elements in the array and implicitly output the result.

Shaggy

Posted 2017-07-27T13:35:50.400

Reputation: 24 623

1I don't think the range needs to be inclusive. Dz%UÃâ seems to work just fine. – Oliver – 2017-07-27T20:28:20.300

3

Brachylog, 10 9 bytes

>ℕ^₂;?%≜ᶠ

Try it online!

Explanation

       ≜ᶠ       Find all numbers satisfying those constraints:
    ;?%           It must be the result of X mod Input where X…
  ^₂              …is a square…
>ℕ                …of an integer in [0, …, Input - 1]

Fatalize

Posted 2017-07-27T13:35:50.400

Reputation: 32 976

I was about to suggest {>≜^₂;?%}ᵘ as an alternative...then I realized there are negative numbers too. >_< – Erik the Outgolfer – 2017-07-27T14:23:06.053

1@EriktheOutgolfer Once a commit gets pulled to TIO, I can actually reduce this answer to 9 bytes indeed using . – Fatalize – 2017-07-27T14:43:20.030

OK...how would it work when there are negative numbers too? Would it simply ignore them or something? – Erik the Outgolfer – 2017-07-27T14:47:00.227

@EriktheOutgolfer mod can be defined as remainder of division, which would be positive (the quotient takes the sign). EDIT: also, squares are positive. – jaxad0127 – 2017-07-27T17:05:55.573

@jaxad0127 I don't think that's the case here, since > would still account for negative numbers afaik. – Erik the Outgolfer – 2017-07-27T17:56:36.663

@EriktheOutgolfer See edit – Fatalize – 2017-07-28T06:56:15.037

@Fatalize You used so that you can save over {}...seems legit. – Erik the Outgolfer – 2017-07-28T08:13:31.177

3

C#, 63 bytes

using System.Linq;m=>new int[m].Select((_,n)=>n*n%m).Distinct()

Try it online!

TheLethalCoder

Posted 2017-07-27T13:35:50.400

Reputation: 6 930

3

JavaScript (ES6), 52 bytes

f=(m,k=m,x={})=>k?f(x[k*k%m]=m,k-1,x):Object.keys(x)

Test cases

f=(m,k=m,x={})=>k?f(x[k*k%m]=m,k-1,x):Object.keys(x)

;[1, 2, 10, 16, 31, 120]
.map(m => console.log(m + ' -> ' + f(m)))


Non-recursive version, 60 58 bytes

Saved 2 bytes thanks to @ThePirateBay

m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))

Test cases

let f =

m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v))

;[1, 2, 10, 16, 31, 120]
.map(m => console.log(m + ' -> ' + f(m)))

Arnauld

Posted 2017-07-27T13:35:50.400

Reputation: 111 334

Non-recursive 58 bytes: m=>(a=[...Array(m).keys()]).filter(v=>a.some(n=>n*n%m==v)) – None – 2017-07-27T15:06:39.373

@ThePirateBay Good catch. Thanks. – Arnauld – 2017-07-27T15:10:33.493

3

Pyth, 6 bytes

{%RQ*R

Try it online

How it works

{%RQ*RdQ    implicit variables
       Q    autoinitialized to eval(input())
    *R      over [0, …, Q-1], map d ↦ d times
      d         d
 %R         map d ↦ d modulo
   Q            Q
{           deduplicate

Anders Kaseorg

Posted 2017-07-27T13:35:50.400

Reputation: 29 242

2

Python 3, 40 39 37 bytes

-1 byte thanks to Mr. Xcoder. -2 bytes thanks to Business Cat.

lambda m:[*{n*n%m for n in range(m)}]

Try it online!

totallyhuman

Posted 2017-07-27T13:35:50.400

Reputation: 15 378

1Can't you replace n**2 with n*n? – Mr. Xcoder – 2017-07-27T13:44:13.963

Yup, always forget that. >< Thanks! – totallyhuman – 2017-07-27T13:44:27.123

2Also, just range(m) is sufficient – Business Cat – 2017-07-27T13:45:05.290

1

You can use sets for 34 bytes

– Mr. Xcoder – 2017-07-27T13:46:33.293

2

Actually, 11 bytes

;╗r⌠²╜@%⌡M╔

Try it online!

Explanation:

;╗r⌠²╜@%⌡M╔
;╗           store a copy of m in register 0
  r          range(m)
   ⌠²╜@%⌡M   for n in range:
    ²          n**2
     ╜@%       mod m
          ╔  remove duplicates

Mego

Posted 2017-07-27T13:35:50.400

Reputation: 32 998

2

Haskell, 45 bytes

import Data.List
f m=nub[n^2`mod`m|n<-[0..m]]

-4 bytes from Anders Kaseorg

Try it online!

Mego

Posted 2017-07-27T13:35:50.400

Reputation: 32 998

Sadly point-free version f m=nub$map((\mod`m).(^2))[0..m]` is just as long, unless there is a sneaky syntax to get rid of extra parentheses. – shooqie – 2017-07-27T14:00:20.773

2

CJam, 12 bytes

{_,_.*\f%_&}

Anonymous block accepting a number and returning a list.

Try it online!

Explanation

_,          Copy n and get the range [0 .. n-1]
  _.*       Multiply each element by itself (square each)
     \f%    Mod each by n
        _&  Deduplicate

Business Cat

Posted 2017-07-27T13:35:50.400

Reputation: 8 927

Nice! I had {:X{_*X%}%_&} for 13 bytes – Luis Mendo – 2017-07-27T13:59:22.967

2

MATL, 6 5 bytes

-1 byte thanks to @LuisMendo

:UG\u

Try it online!

Cinaski

Posted 2017-07-27T13:35:50.400

Reputation: 1 588

Thanks! I looked through the doc searching for that function but wasn't able to find it. – Cinaski – 2017-07-28T13:31:17.353

BTW this interpreter created by Suever has documentation search, you may find it useful

– Luis Mendo – 2017-07-28T14:11:21.957

1

Scala, 32 30 bytes

Simple use of the easy tip from OP.

(0 to n-1).map(x=>x*x%n).toSet

Try it online!

-2 bytes thanks to @MrXcoder, with priorities (no need for () around * operation)

Wondering: is this possible to implicitly tell the compiler to understand things like (0 to n-1)map(x=>x*x%n)toSet (without having to import scala.language.postfixOps)?

V. Courtois

Posted 2017-07-27T13:35:50.400

Reputation: 868

1(0 to n-1).map(x=>x*x%n).toSet for 30 bytes. Exponentiation has higher precedence than modulo. – Mr. Xcoder – 2017-07-27T14:23:26.303

@Mr.Xcoder ooh~ thanks :) – V. Courtois – 2017-07-27T14:26:30.923

1

Octave, 27 bytes

@(n)unique(mod((1:n).^2,n))

Try it online!

Luis Mendo

Posted 2017-07-27T13:35:50.400

Reputation: 87 464

1

Mathematica, 30 bytes

Union@Table[Mod[i^2,#],{i,#}]&

Try it online!

J42161217

Posted 2017-07-27T13:35:50.400

Reputation: 15 931

1

JavaScript (ES6), 48 bytes

f=
n=>[...new Set([...Array(n)].map((_,i)=>i*i%n))]
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

43 bytes if returning a Set instead of an array is acceptable.

Neil

Posted 2017-07-27T13:35:50.400

Reputation: 95 035

1

Haskell, 44 bytes

f m=[k|k<-[0..m],or[mod(n^2)m==k|n<-[0..m]]]

Try it online!

Anders Kaseorg

Posted 2017-07-27T13:35:50.400

Reputation: 29 242

0

Retina, 70 bytes

.+
$*

;$`¶$`
1(?=.*;(.*))|;1*
$1
(1+)(?=((.*¶)+\1)?$)

D`1*¶
^|1+
$.&

Try it online! Warning: Slow for large inputs. Slightly faster 72-byte version:

.+
$*

$'¶$';
1(?=.*;(.*))|;1*
$1
+s`^((1+)¶.*)\2
$1
^1+

D`1*¶
^|1+
$.&

Try it online!

Neil

Posted 2017-07-27T13:35:50.400

Reputation: 95 035

0

Clojure, 40 bytes

#(set(map(fn[x](mod(* x x)%))(range %)))

MattPutnam

Posted 2017-07-27T13:35:50.400

Reputation: 521

0

Ruby, 31 30 bytes

->m{(0..m).map{|n|n*n%m}.uniq}

Try it online!

Alexis Andersen

Posted 2017-07-27T13:35:50.400

Reputation: 591

0

Perl 6, 19 bytes

{set (^$_)»²X%$_}

Test it

Expanded:

{ # bare block lambda with implicit param 「$_」

  set        # turn the following into a Set (shorter than 「unique」)

      (
        ^$_  # a Range upto (and excluding) 「$_」
      )»²    # square each of them (possibly in parallel)

    X%       # cross modulus the squared values by

      $_     # the input
}

Brad Gilbert b2gills

Posted 2017-07-27T13:35:50.400

Reputation: 12 713

0

Pyth, 13 bytes

VQ aY.^N2Q){Y

Try online.

Lame attempt at explaining:

VQ               for N in [0 .. input-1]
                   blank space to supress implicit print inside the loop
     .^N2Q         N ^ 2 % input
   aY              append that to Y, which is initially an empty list
          )      end for
           {Y    deduplicate and implicit print

To sort the output, insert an S on any side of the {

I think there should be a shorter way...

alleks

Posted 2017-07-27T13:35:50.400

Reputation: 61

1

Yeah, the functional style of Pyth tends to be much more concise. map is your friend!

– Anders Kaseorg – 2017-07-28T03:47:58.140

0

Python 2, 59 bytes

t=int(input())
print list(set([(i*i)%t for i in range(t)]))

Try it online!

Husnain Raza

Posted 2017-07-27T13:35:50.400

Reputation: 329

0

PowerShell, 35 bytes

0..($n="$args")|%{$_*$_%$n}|sort -u

Try it online!

Joey

Posted 2017-07-27T13:35:50.400

Reputation: 12 260

0

R, 28 bytes

unique((1:(n<-scan()))^2%%n)

Try it online!

Leaky Nun

Posted 2017-07-27T13:35:50.400

Reputation: 45 011

0

8th, 138 131 bytes

Code

[] swap dup >r ( 2 ^ r@ n:mod a:push ) 1 rot loop rdrop ' n:cmp a:sort ' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip

Explanation

[] - Create output array

swap dup >r - Save input for later use

( 2 ^ r@ n:mod a:push ) 1 rot loop - Compute square end

rdrop - Clean r-stack

' n:cmp a:sort - Sort output array

' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip - Get rid of consecutive duplicates from array

SED (Stack Effect Diagram) is: a -- a

Usage and example

: f [] swap dup >r ( 2 n:^ r@ n:mod a:push ) 1 rot loop rdrop ' n:cmp a:sort ' n:cmp >r -1 a:@ swap ( tuck r@ w:exec ) a:filter rdrop nip ;

ok> 120 f .
[0,1,4,9,16,24,25,36,40,49,60,64,76,81,84,96,100,105]

Chaos Manor

Posted 2017-07-27T13:35:50.400

Reputation: 521

0

Java (OpenJDK 8), 86 77 bytes

n->java.util.stream.IntStream.range(1,n+1).map(a->a*a%n).distinct().toArray()

Try it online!

Xanderhall

Posted 2017-07-27T13:35:50.400

Reputation: 1 236

Check your byte count, and you can save by using java.util.stream.IntStream instead of the import. – Jakob – 2017-09-05T17:13:56.467

0

PHP, 53 bytes

for(;$i<$t=$argv[1];)$a[$z=$i++**2%$t]++?:print"$z
";

Loop from 0 to the input number, using the n^2 mod base formula to mark numbers that have been used. It goes to that position in an array, checking if it's been incremented and outputting it if it hasn't. It then increments it afterwards so duplicate values don't get printed.

Try it online!

Xanderhall

Posted 2017-07-27T13:35:50.400

Reputation: 1 236

0

Perl 5, 41 + 1 (-n) = 42 bytes

$k{$n++**2%$_}++while$n<$_;say for keys%k

Try it online!

Xcali

Posted 2017-07-27T13:35:50.400

Reputation: 7 671

0

Pari/GP, 25 bytes

n->Set([x^2%n|x<-[1..n]])

Try it online!

alephalpha

Posted 2017-07-27T13:35:50.400

Reputation: 23 988