Senin, 18 Maret 2019

Prime factors and perfect square





















3
























$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$
































    3
























    $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$




























      3






















      3














      3






      $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 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










      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 3 hours ago













      ManuelManuel



      1333







      1333







      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





































          3
























          $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 . 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 . 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$


























            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

















            3
























            $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 . 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 . 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$


































              3
























              $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 . 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 . 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$






























                3






















                3














                3






                $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 . 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 . 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 . 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 . 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 1 hour ago













                Vogel612



                21.9k447130







                21.9k447130















                answered 1 hour ago













                ZetaZeta



                15.5k23975







                15.5k23975



































                    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









                    Prime factors and perfect square Rating: 4.5 Diposkan Oleh: Admin

                    0 komentar:

                    Posting Komentar

                    Popular Posts