First, let's acknowledge that this was a horrible test. You have almost no power to discriminate between the different abilities of the students with a mean of 23% and a standard deviation of 5%.
Then you have to decide what to do. Personally, I'd decrease the weight of this test in acknowledgement that it was a poor test (or allow students the option of letting something else count for more). But if you just want to solve it numerically, there are the following constraints:
- You can't have a top score of more than 100%
- The mean is required to be 72%
- You want all differences to still mean something
If you add 49% to the grades, you get a mean of 72% but your top score is now 117%. You could cap it at 90-95% or so, but the top students would be indistinguishable. So you'd have to scale back by squashing the grades also, e.g. by multiplying the difference from 23% by (28/45) to get it back in range. This will make the students distinguishable but not meaningfully so.
Really the best option is to change the grading scheme so that you have a higher mean and more distinction between different scores (to the extent that this is possible). For example, you can give a number of points for attempting a problem at all, a number of points for writing down anything which has a bearing on the right answer, etc..
You can just directly transform your old scores into new scores with the mean and deviation you like, however. Let
icdfG(p) be the value at which the probability of getting a lower percentile score
p from a Normal distribution with mean 0 and standard deviation is 1. Then you can just calculate percentiles and map
new score = 72 + icdfG(percentile)*10
or something to get a mean of 72 and a standard deviation of 10. (Your top student in a class of 84 would have a percentile of 83.5/84 if you did it this way.) Your top student would have a score of 97 under this scheme (and the second to top a score of 93)
Otherwise, you're probably best off using a nonlinear transform;
arctan is a nice function for that since it will squash down the tails; and you probably want a SD of at least 10 not 5, so you could do something like
new score = 72 + 50/Pi * arctan((score - 23)/10)
which would give a max score if 93.5, a min score of 54.7, and one standard deviation up and down would give 79.4 and 64.6 respectively.
But again, the better options are to devalue the test as a bad test, and to change the grading scheme (an awful lot of work, but it will give fairer results).