Prime factors and perfect squarePrime numbers, Prime Factors and LCMCaml light and finding the prime factorsA fast approach to prime number sieving (non-threaded array)Counting finite abelian groupsProject Euler #127 abc-hitsPrimes & SquaresFind prime factors and reverse stringsFunctionaly Finding Prime Factors with MultiplicityFind prime factors in C++Printing factors and prime factors of a number

Why doesn't the fusion process of the sun speed up?

Do native speakers use "ultima" and "proxima" frequently in spoken English?

How to find the largest number(s) in a list of elements?

Why do I have a large white artefact on the rendered image?

How can I create URL shortcuts/redirects for task/diff IDs in Phabricator?

What (if any) is the reason to buy in small local stores?

Should a narrator ever describe things based on a characters view instead of fact?

Error in master's thesis, I do not know what to do

Animating wave motion in water

Why is indicated airspeed rather than ground speed used during the takeoff roll?

UK Tourist Visa- Enquiry

How do you justify more code being written by following clean code practices?

What is the tangent at a sharp point on a curve?

When should a starting writer get his own webpage?

label a part of commutative diagram

What is the reasoning behind standardization (dividing by standard deviation)?

PTIJ: Which Dr. Seuss books should one obtain?

Are hand made posters acceptable in Academia?

Don't understand why (5 | -2) > 0 is False where (5 or -2) > 0 is True

How do researchers send unsolicited emails asking for feedback on their works?

If I cast the Enlarge/Reduce spell on an arrow, what weapon could it count as?

Jem'Hadar, something strange about their life expectancy

Would it be believable to defy demographics in a story?

Difficulty understanding group delay concept



Prime factors and perfect square


Prime numbers, Prime Factors and LCMCaml light and finding the prime factorsA fast approach to prime number sieving (non-threaded array)Counting finite abelian groupsProject Euler #127 abc-hitsPrimes & SquaresFind prime factors and reverse stringsFunctionaly Finding Prime Factors with MultiplicityFind prime factors in C++Printing factors and prime factors of a number













6












$begingroup$


I want to convert an integer to a perfect square by multiplying it by some number. That number is the product of all the prime factors of the number which not appear an even number of times. Example 12 = 2 x 2 x 3; 2 appears twice (even number of times) but 3 just once (odd number of times), so the number I need to multiply 12 by to get a perfect square is 3. And in fact 12 x 3 = 36 = 6 * 6.



I converted my code to Haskell and would like to know what suggestions you have.



import Data.List (group)

toPerfectSquare :: Int -> Int
toPerfectSquare n = product . map ((x:_) -> x) . filter (not . even . length) . group $ primefactors n

primefactors :: Int -> [Int]
primefactors n = prmfctrs' n 2 [3,5..]
where
prmfctrs' m d ds | m < 2 = [1]
| m < d^2 = [m]
| r == 0 = d : prmfctrs' q d ds
| otherwise = prmfctrs' m (head ds) (tail ds)
where (q, r) = quotRem m d


Sorry about the naming, I'm bad at giving names.



One particular doubt I have is in the use of $ in toPerfectSquare, that I first used . but it didn't work and I needed to use parenthesis. Why? And is it usual to have that many compositions in one line?










share|improve this question









New contributor




Manuel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







$endgroup$
















    6












    $begingroup$


    I want to convert an integer to a perfect square by multiplying it by some number. That number is the product of all the prime factors of the number which not appear an even number of times. Example 12 = 2 x 2 x 3; 2 appears twice (even number of times) but 3 just once (odd number of times), so the number I need to multiply 12 by to get a perfect square is 3. And in fact 12 x 3 = 36 = 6 * 6.



    I converted my code to Haskell and would like to know what suggestions you have.



    import Data.List (group)

    toPerfectSquare :: Int -> Int
    toPerfectSquare n = product . map ((x:_) -> x) . filter (not . even . length) . group $ primefactors n

    primefactors :: Int -> [Int]
    primefactors n = prmfctrs' n 2 [3,5..]
    where
    prmfctrs' m d ds | m < 2 = [1]
    | m < d^2 = [m]
    | r == 0 = d : prmfctrs' q d ds
    | otherwise = prmfctrs' m (head ds) (tail ds)
    where (q, r) = quotRem m d


    Sorry about the naming, I'm bad at giving names.



    One particular doubt I have is in the use of $ in toPerfectSquare, that I first used . but it didn't work and I needed to use parenthesis. Why? And is it usual to have that many compositions in one line?










    share|improve this question









    New contributor




    Manuel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.







    $endgroup$














      6












      6








      6





      $begingroup$


      I want to convert an integer to a perfect square by multiplying it by some number. That number is the product of all the prime factors of the number which not appear an even number of times. Example 12 = 2 x 2 x 3; 2 appears twice (even number of times) but 3 just once (odd number of times), so the number I need to multiply 12 by to get a perfect square is 3. And in fact 12 x 3 = 36 = 6 * 6.



      I converted my code to Haskell and would like to know what suggestions you have.



      import Data.List (group)

      toPerfectSquare :: Int -> Int
      toPerfectSquare n = product . map ((x:_) -> x) . filter (not . even . length) . group $ primefactors n

      primefactors :: Int -> [Int]
      primefactors n = prmfctrs' n 2 [3,5..]
      where
      prmfctrs' m d ds | m < 2 = [1]
      | m < d^2 = [m]
      | r == 0 = d : prmfctrs' q d ds
      | otherwise = prmfctrs' m (head ds) (tail ds)
      where (q, r) = quotRem m d


      Sorry about the naming, I'm bad at giving names.



      One particular doubt I have is in the use of $ in toPerfectSquare, that I first used . but it didn't work and I needed to use parenthesis. Why? And is it usual to have that many compositions in one line?










      share|improve this question









      New contributor




      Manuel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.







      $endgroup$




      I want to convert an integer to a perfect square by multiplying it by some number. That number is the product of all the prime factors of the number which not appear an even number of times. Example 12 = 2 x 2 x 3; 2 appears twice (even number of times) but 3 just once (odd number of times), so the number I need to multiply 12 by to get a perfect square is 3. And in fact 12 x 3 = 36 = 6 * 6.



      I converted my code to Haskell and would like to know what suggestions you have.



      import Data.List (group)

      toPerfectSquare :: Int -> Int
      toPerfectSquare n = product . map ((x:_) -> x) . filter (not . even . length) . group $ primefactors n

      primefactors :: Int -> [Int]
      primefactors n = prmfctrs' n 2 [3,5..]
      where
      prmfctrs' m d ds | m < 2 = [1]
      | m < d^2 = [m]
      | r == 0 = d : prmfctrs' q d ds
      | otherwise = prmfctrs' m (head ds) (tail ds)
      where (q, r) = quotRem m d


      Sorry about the naming, I'm bad at giving names.



      One particular doubt I have is in the use of $ in toPerfectSquare, that I first used . but it didn't work and I needed to use parenthesis. Why? And is it usual to have that many compositions in one line?







      haskell primes integer






      share|improve this question









      New contributor




      Manuel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      Manuel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited 9 hours ago









      200_success

      130k17153419




      130k17153419






      New contributor




      Manuel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 14 hours ago









      ManuelManuel

      1503




      1503




      New contributor




      Manuel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Manuel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Manuel is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.




















          1 Answer
          1






          active

          oldest

          votes


















          6












          $begingroup$

          We can replace some custom functions or constructs by standard library ones:




          • (x:_) -> x is called head


          • not . even is called odd

          Next, 1 is not a prime, and 1 does not have a prime factorization. Since product [] yields 1, we can use [] instead in prmfctrs'.



          The worker prmfctrs' is a mouthful. Workers are usually called the same as their context (but with an apostrophe, so primefactors') or short names like go.



          And last but not least, we can use @ bindings to pattern match on the head, tail and the whole list at once.



          If we apply those suggestions, we get



          import Data.List (group)

          toPerfectSquare :: Int -> Int
          toPerfectSquare n = product . map head . filter (odd . length) . group $ primefactors n

          primefactors :: Int -> [Int]
          primefactors n = go n 2 [3,5..]
          where
          go m d ds@(p:ps) | m < 2 = []
          | m < d^2 = [m]
          | r == 0 = d : go q d ds
          | otherwise = go m p ps
          where (q, r) = quotRem m d


          In theory, we can even get rid of a parameter in go, namely the d, so that we always just look at the list of the divisors:



          import Data.List (group)

          toPerfectSquare :: Int -> Int
          toPerfectSquare n = product . map head . filter (odd . length) . group $ primefactors n

          primefactors :: Int -> [Int]
          primefactors n = go n $ 2 : [3,5..]
          where
          go m dss@(d:ds) | m < 2 = []
          | m < d^2 = [m]
          | r == 0 = d : go q dss
          | otherwise = go m ds
          where (q, r) = m `quotRem` d


          We could also introduce another function $f$, so that for any $a,b in mathbb N$ we get a pair $(n,y) in mathbb N^2$ such that



          $$
          a^n y = b
          $$

          If we had that function, we could write use it to check easily whether the power of a given factor is even or odd. However, that function and its use in toPerfectSquare are left as an exercise.






          share|improve this answer











          $endgroup$












          • $begingroup$
            You mean that function f as an optimization to the algorithm or to clean a bit the code? My problem is that I cannot “think in Haskell”, so I'm converting code I already have in other language to learn more about how to program in Haskell. By the way, I think you removed map and you wanted to keep map head (almost everytime a function exists, but it's difficult to know it exists, so many functions to learn, but I will keep learning to use Hoogle). And nice to know product [] gives 1 (I didn't kno, which is precisely why I used [1] instead of []).
            $endgroup$
            – Manuel
            11 hours ago











          • $begingroup$
            @Manuel Yeah, wanted to use map head, sorry. The function f is both a clean-up, as well as an optimization, as you can get rid of the list of primefactors. However, it's not necessary to solve this and is therefore just an optional exercise.
            $endgroup$
            – Zeta
            9 hours ago











          • $begingroup$
            I thought a bit and I think it does solve the problem more concisely, but I couldn't figure how to do it in Haskell directly (I would need to write in other language and then try to translate), so I will leave it for now. Thanks again for the answer! By the way at first i used sqrt m < d but changed to m < d^2 because I thought it would be more efficient, is that the case?
            $endgroup$
            – Manuel
            2 hours ago










          • $begingroup$
            Usually yes. sqrt is a very expensive operation in most programming languages, whereas multiplication is a single assembly instruction as long as we're using native CPU integers. However, Haskell being Haskell, sqrt doesn't even work on Int, as sqrt only works on floating point numbers. So m < d*d was not only more efficient, but more idiomatic Haskell in that regard :)
            $endgroup$
            – Zeta
            2 hours ago










          Your Answer





          StackExchange.ifUsing("editor", function ()
          return StackExchange.using("mathjaxEditing", function ()
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          );
          );
          , "mathjax-editing");

          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "196"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );






          Manuel is a new contributor. Be nice, and check out our Code of Conduct.









          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215654%2fprime-factors-and-perfect-square%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          6












          $begingroup$

          We can replace some custom functions or constructs by standard library ones:




          • (x:_) -> x is called head


          • not . even is called odd

          Next, 1 is not a prime, and 1 does not have a prime factorization. Since product [] yields 1, we can use [] instead in prmfctrs'.



          The worker prmfctrs' is a mouthful. Workers are usually called the same as their context (but with an apostrophe, so primefactors') or short names like go.



          And last but not least, we can use @ bindings to pattern match on the head, tail and the whole list at once.



          If we apply those suggestions, we get



          import Data.List (group)

          toPerfectSquare :: Int -> Int
          toPerfectSquare n = product . map head . filter (odd . length) . group $ primefactors n

          primefactors :: Int -> [Int]
          primefactors n = go n 2 [3,5..]
          where
          go m d ds@(p:ps) | m < 2 = []
          | m < d^2 = [m]
          | r == 0 = d : go q d ds
          | otherwise = go m p ps
          where (q, r) = quotRem m d


          In theory, we can even get rid of a parameter in go, namely the d, so that we always just look at the list of the divisors:



          import Data.List (group)

          toPerfectSquare :: Int -> Int
          toPerfectSquare n = product . map head . filter (odd . length) . group $ primefactors n

          primefactors :: Int -> [Int]
          primefactors n = go n $ 2 : [3,5..]
          where
          go m dss@(d:ds) | m < 2 = []
          | m < d^2 = [m]
          | r == 0 = d : go q dss
          | otherwise = go m ds
          where (q, r) = m `quotRem` d


          We could also introduce another function $f$, so that for any $a,b in mathbb N$ we get a pair $(n,y) in mathbb N^2$ such that



          $$
          a^n y = b
          $$

          If we had that function, we could write use it to check easily whether the power of a given factor is even or odd. However, that function and its use in toPerfectSquare are left as an exercise.






          share|improve this answer











          $endgroup$












          • $begingroup$
            You mean that function f as an optimization to the algorithm or to clean a bit the code? My problem is that I cannot “think in Haskell”, so I'm converting code I already have in other language to learn more about how to program in Haskell. By the way, I think you removed map and you wanted to keep map head (almost everytime a function exists, but it's difficult to know it exists, so many functions to learn, but I will keep learning to use Hoogle). And nice to know product [] gives 1 (I didn't kno, which is precisely why I used [1] instead of []).
            $endgroup$
            – Manuel
            11 hours ago











          • $begingroup$
            @Manuel Yeah, wanted to use map head, sorry. The function f is both a clean-up, as well as an optimization, as you can get rid of the list of primefactors. However, it's not necessary to solve this and is therefore just an optional exercise.
            $endgroup$
            – Zeta
            9 hours ago











          • $begingroup$
            I thought a bit and I think it does solve the problem more concisely, but I couldn't figure how to do it in Haskell directly (I would need to write in other language and then try to translate), so I will leave it for now. Thanks again for the answer! By the way at first i used sqrt m < d but changed to m < d^2 because I thought it would be more efficient, is that the case?
            $endgroup$
            – Manuel
            2 hours ago










          • $begingroup$
            Usually yes. sqrt is a very expensive operation in most programming languages, whereas multiplication is a single assembly instruction as long as we're using native CPU integers. However, Haskell being Haskell, sqrt doesn't even work on Int, as sqrt only works on floating point numbers. So m < d*d was not only more efficient, but more idiomatic Haskell in that regard :)
            $endgroup$
            – Zeta
            2 hours ago















          6












          $begingroup$

          We can replace some custom functions or constructs by standard library ones:




          • (x:_) -> x is called head


          • not . even is called odd

          Next, 1 is not a prime, and 1 does not have a prime factorization. Since product [] yields 1, we can use [] instead in prmfctrs'.



          The worker prmfctrs' is a mouthful. Workers are usually called the same as their context (but with an apostrophe, so primefactors') or short names like go.



          And last but not least, we can use @ bindings to pattern match on the head, tail and the whole list at once.



          If we apply those suggestions, we get



          import Data.List (group)

          toPerfectSquare :: Int -> Int
          toPerfectSquare n = product . map head . filter (odd . length) . group $ primefactors n

          primefactors :: Int -> [Int]
          primefactors n = go n 2 [3,5..]
          where
          go m d ds@(p:ps) | m < 2 = []
          | m < d^2 = [m]
          | r == 0 = d : go q d ds
          | otherwise = go m p ps
          where (q, r) = quotRem m d


          In theory, we can even get rid of a parameter in go, namely the d, so that we always just look at the list of the divisors:



          import Data.List (group)

          toPerfectSquare :: Int -> Int
          toPerfectSquare n = product . map head . filter (odd . length) . group $ primefactors n

          primefactors :: Int -> [Int]
          primefactors n = go n $ 2 : [3,5..]
          where
          go m dss@(d:ds) | m < 2 = []
          | m < d^2 = [m]
          | r == 0 = d : go q dss
          | otherwise = go m ds
          where (q, r) = m `quotRem` d


          We could also introduce another function $f$, so that for any $a,b in mathbb N$ we get a pair $(n,y) in mathbb N^2$ such that



          $$
          a^n y = b
          $$

          If we had that function, we could write use it to check easily whether the power of a given factor is even or odd. However, that function and its use in toPerfectSquare are left as an exercise.






          share|improve this answer











          $endgroup$












          • $begingroup$
            You mean that function f as an optimization to the algorithm or to clean a bit the code? My problem is that I cannot “think in Haskell”, so I'm converting code I already have in other language to learn more about how to program in Haskell. By the way, I think you removed map and you wanted to keep map head (almost everytime a function exists, but it's difficult to know it exists, so many functions to learn, but I will keep learning to use Hoogle). And nice to know product [] gives 1 (I didn't kno, which is precisely why I used [1] instead of []).
            $endgroup$
            – Manuel
            11 hours ago











          • $begingroup$
            @Manuel Yeah, wanted to use map head, sorry. The function f is both a clean-up, as well as an optimization, as you can get rid of the list of primefactors. However, it's not necessary to solve this and is therefore just an optional exercise.
            $endgroup$
            – Zeta
            9 hours ago











          • $begingroup$
            I thought a bit and I think it does solve the problem more concisely, but I couldn't figure how to do it in Haskell directly (I would need to write in other language and then try to translate), so I will leave it for now. Thanks again for the answer! By the way at first i used sqrt m < d but changed to m < d^2 because I thought it would be more efficient, is that the case?
            $endgroup$
            – Manuel
            2 hours ago










          • $begingroup$
            Usually yes. sqrt is a very expensive operation in most programming languages, whereas multiplication is a single assembly instruction as long as we're using native CPU integers. However, Haskell being Haskell, sqrt doesn't even work on Int, as sqrt only works on floating point numbers. So m < d*d was not only more efficient, but more idiomatic Haskell in that regard :)
            $endgroup$
            – Zeta
            2 hours ago













          6












          6








          6





          $begingroup$

          We can replace some custom functions or constructs by standard library ones:




          • (x:_) -> x is called head


          • not . even is called odd

          Next, 1 is not a prime, and 1 does not have a prime factorization. Since product [] yields 1, we can use [] instead in prmfctrs'.



          The worker prmfctrs' is a mouthful. Workers are usually called the same as their context (but with an apostrophe, so primefactors') or short names like go.



          And last but not least, we can use @ bindings to pattern match on the head, tail and the whole list at once.



          If we apply those suggestions, we get



          import Data.List (group)

          toPerfectSquare :: Int -> Int
          toPerfectSquare n = product . map head . filter (odd . length) . group $ primefactors n

          primefactors :: Int -> [Int]
          primefactors n = go n 2 [3,5..]
          where
          go m d ds@(p:ps) | m < 2 = []
          | m < d^2 = [m]
          | r == 0 = d : go q d ds
          | otherwise = go m p ps
          where (q, r) = quotRem m d


          In theory, we can even get rid of a parameter in go, namely the d, so that we always just look at the list of the divisors:



          import Data.List (group)

          toPerfectSquare :: Int -> Int
          toPerfectSquare n = product . map head . filter (odd . length) . group $ primefactors n

          primefactors :: Int -> [Int]
          primefactors n = go n $ 2 : [3,5..]
          where
          go m dss@(d:ds) | m < 2 = []
          | m < d^2 = [m]
          | r == 0 = d : go q dss
          | otherwise = go m ds
          where (q, r) = m `quotRem` d


          We could also introduce another function $f$, so that for any $a,b in mathbb N$ we get a pair $(n,y) in mathbb N^2$ such that



          $$
          a^n y = b
          $$

          If we had that function, we could write use it to check easily whether the power of a given factor is even or odd. However, that function and its use in toPerfectSquare are left as an exercise.






          share|improve this answer











          $endgroup$



          We can replace some custom functions or constructs by standard library ones:




          • (x:_) -> x is called head


          • not . even is called odd

          Next, 1 is not a prime, and 1 does not have a prime factorization. Since product [] yields 1, we can use [] instead in prmfctrs'.



          The worker prmfctrs' is a mouthful. Workers are usually called the same as their context (but with an apostrophe, so primefactors') or short names like go.



          And last but not least, we can use @ bindings to pattern match on the head, tail and the whole list at once.



          If we apply those suggestions, we get



          import Data.List (group)

          toPerfectSquare :: Int -> Int
          toPerfectSquare n = product . map head . filter (odd . length) . group $ primefactors n

          primefactors :: Int -> [Int]
          primefactors n = go n 2 [3,5..]
          where
          go m d ds@(p:ps) | m < 2 = []
          | m < d^2 = [m]
          | r == 0 = d : go q d ds
          | otherwise = go m p ps
          where (q, r) = quotRem m d


          In theory, we can even get rid of a parameter in go, namely the d, so that we always just look at the list of the divisors:



          import Data.List (group)

          toPerfectSquare :: Int -> Int
          toPerfectSquare n = product . map head . filter (odd . length) . group $ primefactors n

          primefactors :: Int -> [Int]
          primefactors n = go n $ 2 : [3,5..]
          where
          go m dss@(d:ds) | m < 2 = []
          | m < d^2 = [m]
          | r == 0 = d : go q dss
          | otherwise = go m ds
          where (q, r) = m `quotRem` d


          We could also introduce another function $f$, so that for any $a,b in mathbb N$ we get a pair $(n,y) in mathbb N^2$ such that



          $$
          a^n y = b
          $$

          If we had that function, we could write use it to check easily whether the power of a given factor is even or odd. However, that function and its use in toPerfectSquare are left as an exercise.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 9 hours ago

























          answered 12 hours ago









          ZetaZeta

          15.5k23975




          15.5k23975











          • $begingroup$
            You mean that function f as an optimization to the algorithm or to clean a bit the code? My problem is that I cannot “think in Haskell”, so I'm converting code I already have in other language to learn more about how to program in Haskell. By the way, I think you removed map and you wanted to keep map head (almost everytime a function exists, but it's difficult to know it exists, so many functions to learn, but I will keep learning to use Hoogle). And nice to know product [] gives 1 (I didn't kno, which is precisely why I used [1] instead of []).
            $endgroup$
            – Manuel
            11 hours ago











          • $begingroup$
            @Manuel Yeah, wanted to use map head, sorry. The function f is both a clean-up, as well as an optimization, as you can get rid of the list of primefactors. However, it's not necessary to solve this and is therefore just an optional exercise.
            $endgroup$
            – Zeta
            9 hours ago











          • $begingroup$
            I thought a bit and I think it does solve the problem more concisely, but I couldn't figure how to do it in Haskell directly (I would need to write in other language and then try to translate), so I will leave it for now. Thanks again for the answer! By the way at first i used sqrt m < d but changed to m < d^2 because I thought it would be more efficient, is that the case?
            $endgroup$
            – Manuel
            2 hours ago










          • $begingroup$
            Usually yes. sqrt is a very expensive operation in most programming languages, whereas multiplication is a single assembly instruction as long as we're using native CPU integers. However, Haskell being Haskell, sqrt doesn't even work on Int, as sqrt only works on floating point numbers. So m < d*d was not only more efficient, but more idiomatic Haskell in that regard :)
            $endgroup$
            – Zeta
            2 hours ago
















          • $begingroup$
            You mean that function f as an optimization to the algorithm or to clean a bit the code? My problem is that I cannot “think in Haskell”, so I'm converting code I already have in other language to learn more about how to program in Haskell. By the way, I think you removed map and you wanted to keep map head (almost everytime a function exists, but it's difficult to know it exists, so many functions to learn, but I will keep learning to use Hoogle). And nice to know product [] gives 1 (I didn't kno, which is precisely why I used [1] instead of []).
            $endgroup$
            – Manuel
            11 hours ago











          • $begingroup$
            @Manuel Yeah, wanted to use map head, sorry. The function f is both a clean-up, as well as an optimization, as you can get rid of the list of primefactors. However, it's not necessary to solve this and is therefore just an optional exercise.
            $endgroup$
            – Zeta
            9 hours ago











          • $begingroup$
            I thought a bit and I think it does solve the problem more concisely, but I couldn't figure how to do it in Haskell directly (I would need to write in other language and then try to translate), so I will leave it for now. Thanks again for the answer! By the way at first i used sqrt m < d but changed to m < d^2 because I thought it would be more efficient, is that the case?
            $endgroup$
            – Manuel
            2 hours ago










          • $begingroup$
            Usually yes. sqrt is a very expensive operation in most programming languages, whereas multiplication is a single assembly instruction as long as we're using native CPU integers. However, Haskell being Haskell, sqrt doesn't even work on Int, as sqrt only works on floating point numbers. So m < d*d was not only more efficient, but more idiomatic Haskell in that regard :)
            $endgroup$
            – Zeta
            2 hours ago















          $begingroup$
          You mean that function f as an optimization to the algorithm or to clean a bit the code? My problem is that I cannot “think in Haskell”, so I'm converting code I already have in other language to learn more about how to program in Haskell. By the way, I think you removed map and you wanted to keep map head (almost everytime a function exists, but it's difficult to know it exists, so many functions to learn, but I will keep learning to use Hoogle). And nice to know product [] gives 1 (I didn't kno, which is precisely why I used [1] instead of []).
          $endgroup$
          – Manuel
          11 hours ago





          $begingroup$
          You mean that function f as an optimization to the algorithm or to clean a bit the code? My problem is that I cannot “think in Haskell”, so I'm converting code I already have in other language to learn more about how to program in Haskell. By the way, I think you removed map and you wanted to keep map head (almost everytime a function exists, but it's difficult to know it exists, so many functions to learn, but I will keep learning to use Hoogle). And nice to know product [] gives 1 (I didn't kno, which is precisely why I used [1] instead of []).
          $endgroup$
          – Manuel
          11 hours ago













          $begingroup$
          @Manuel Yeah, wanted to use map head, sorry. The function f is both a clean-up, as well as an optimization, as you can get rid of the list of primefactors. However, it's not necessary to solve this and is therefore just an optional exercise.
          $endgroup$
          – Zeta
          9 hours ago





          $begingroup$
          @Manuel Yeah, wanted to use map head, sorry. The function f is both a clean-up, as well as an optimization, as you can get rid of the list of primefactors. However, it's not necessary to solve this and is therefore just an optional exercise.
          $endgroup$
          – Zeta
          9 hours ago













          $begingroup$
          I thought a bit and I think it does solve the problem more concisely, but I couldn't figure how to do it in Haskell directly (I would need to write in other language and then try to translate), so I will leave it for now. Thanks again for the answer! By the way at first i used sqrt m < d but changed to m < d^2 because I thought it would be more efficient, is that the case?
          $endgroup$
          – Manuel
          2 hours ago




          $begingroup$
          I thought a bit and I think it does solve the problem more concisely, but I couldn't figure how to do it in Haskell directly (I would need to write in other language and then try to translate), so I will leave it for now. Thanks again for the answer! By the way at first i used sqrt m < d but changed to m < d^2 because I thought it would be more efficient, is that the case?
          $endgroup$
          – Manuel
          2 hours ago












          $begingroup$
          Usually yes. sqrt is a very expensive operation in most programming languages, whereas multiplication is a single assembly instruction as long as we're using native CPU integers. However, Haskell being Haskell, sqrt doesn't even work on Int, as sqrt only works on floating point numbers. So m < d*d was not only more efficient, but more idiomatic Haskell in that regard :)
          $endgroup$
          – Zeta
          2 hours ago




          $begingroup$
          Usually yes. sqrt is a very expensive operation in most programming languages, whereas multiplication is a single assembly instruction as long as we're using native CPU integers. However, Haskell being Haskell, sqrt doesn't even work on Int, as sqrt only works on floating point numbers. So m < d*d was not only more efficient, but more idiomatic Haskell in that regard :)
          $endgroup$
          – Zeta
          2 hours ago










          Manuel is a new contributor. Be nice, and check out our Code of Conduct.









          draft saved

          draft discarded


















          Manuel is a new contributor. Be nice, and check out our Code of Conduct.












          Manuel is a new contributor. Be nice, and check out our Code of Conduct.











          Manuel is a new contributor. Be nice, and check out our Code of Conduct.














          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f215654%2fprime-factors-and-perfect-square%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Bulk add to cart function issuecart vs. mini cart issue … rwd themeRedirect Add to cart button to cart pageAdd to cart issue - Magento 2.1The requested Payment Method is not available When creating an orderM2: reason add-to-cart might not function in production modeAdd to cart issue in some android devicesMagento 2 - custom price can not add to subtotal and grand total after add to cartAdd to cart codeIssue with my cart module on pdp and cart pages, just keeps spinningBulk price and quantity update using rest api

          БиармияSxpst500bh2ntaf! 3h2r