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
$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?
haskell primes integer
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$
add a comment |
$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?
haskell primes integer
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$
add a comment |
$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?
haskell primes integer
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
haskell primes integer
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.
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.
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
$begingroup$
We can replace some custom functions or constructs by standard library ones:
(x:_) -> xis calledheadnot . evenis calledodd
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.
$endgroup$
$begingroup$
You mean that functionfas 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 removedmapand you wanted to keepmap 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 knowproduct []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 usemap head, sorry. The functionfis 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 usedsqrt m < dbut changed tom < d^2because I thought it would be more efficient, is that the case?
$endgroup$
– Manuel
2 hours ago
$begingroup$
Usually yes.sqrtis 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,sqrtdoesn't even work onInt, assqrtonly works on floating point numbers. Som < d*dwas not only more efficient, but more idiomatic Haskell in that regard :)
$endgroup$
– Zeta
2 hours ago
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
$begingroup$
We can replace some custom functions or constructs by standard library ones:
(x:_) -> xis calledheadnot . evenis calledodd
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.
$endgroup$
$begingroup$
You mean that functionfas 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 removedmapand you wanted to keepmap 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 knowproduct []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 usemap head, sorry. The functionfis 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 usedsqrt m < dbut changed tom < d^2because I thought it would be more efficient, is that the case?
$endgroup$
– Manuel
2 hours ago
$begingroup$
Usually yes.sqrtis 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,sqrtdoesn't even work onInt, assqrtonly works on floating point numbers. Som < d*dwas not only more efficient, but more idiomatic Haskell in that regard :)
$endgroup$
– Zeta
2 hours ago
add a comment |
$begingroup$
We can replace some custom functions or constructs by standard library ones:
(x:_) -> xis calledheadnot . evenis calledodd
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.
$endgroup$
$begingroup$
You mean that functionfas 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 removedmapand you wanted to keepmap 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 knowproduct []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 usemap head, sorry. The functionfis 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 usedsqrt m < dbut changed tom < d^2because I thought it would be more efficient, is that the case?
$endgroup$
– Manuel
2 hours ago
$begingroup$
Usually yes.sqrtis 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,sqrtdoesn't even work onInt, assqrtonly works on floating point numbers. Som < d*dwas not only more efficient, but more idiomatic Haskell in that regard :)
$endgroup$
– Zeta
2 hours ago
add a comment |
$begingroup$
We can replace some custom functions or constructs by standard library ones:
(x:_) -> xis calledheadnot . evenis calledodd
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.
$endgroup$
We can replace some custom functions or constructs by standard library ones:
(x:_) -> xis calledheadnot . evenis calledodd
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.
edited 9 hours ago
answered 12 hours ago
ZetaZeta
15.5k23975
15.5k23975
$begingroup$
You mean that functionfas 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 removedmapand you wanted to keepmap 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 knowproduct []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 usemap head, sorry. The functionfis 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 usedsqrt m < dbut changed tom < d^2because I thought it would be more efficient, is that the case?
$endgroup$
– Manuel
2 hours ago
$begingroup$
Usually yes.sqrtis 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,sqrtdoesn't even work onInt, assqrtonly works on floating point numbers. Som < d*dwas not only more efficient, but more idiomatic Haskell in that regard :)
$endgroup$
– Zeta
2 hours ago
add a comment |
$begingroup$
You mean that functionfas 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 removedmapand you wanted to keepmap 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 knowproduct []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 usemap head, sorry. The functionfis 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 usedsqrt m < dbut changed tom < d^2because I thought it would be more efficient, is that the case?
$endgroup$
– Manuel
2 hours ago
$begingroup$
Usually yes.sqrtis 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,sqrtdoesn't even work onInt, assqrtonly works on floating point numbers. Som < d*dwas 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
add a comment |
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.
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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