If the shapes are on a linear coordinate system, it's rather easy to check if a point is inside a polygon. The idea is to draw an infinite (or sufficiently long) line from the point towards right, and see how many times this line intersects segments in the polygon. If this happens odd times, then the point is inside the polygon.
Please see for example How to check if a given point lies inside or outside a polygon?
I will not copy the entire text into this answer, as it is a generic method and there should be multiple examles of it in the net.
Note that as a first optimisation, one could for each point to check exclude all polygon line segments that both start and end either above or below that point. If it is a closed polygon, it doesn't matter how many segments were left out - the polygon always "comes back". This however means that the 1/2 million points need to be checked against a smaller amount of polygon segments.
Distance does matter. If you work with local areas rather than countries, and allow some degree of approximation, and have sufficiently dense (and evenly distributed) polygon vertices (like a dozen or a few dozen), you could try to work directly with the UTM coordinates. However be aware that there will be errors, as the polygon line segments are not straight, out in nature. I take it this is a performance vs. quality issue. To get accuracy, one would have to convert all coordinates (both the 1/2 million points and the polygon vertices) into x,y-coordinates on a linear coordinate system.
As a game coder i might optimise. You didn't mention if the polygon(s?) is static, eg. changes only once a day. Neither did you mention at what rate the 1/2 million points drop in. If there is a performance demand, then pre-calculating when there is time is essential, even at the cost of larger data. If the points drop in along the day, one could already at that stage solve a coordinate trandform cache for each individual point.
A further optimisation would be a way to conclude, at a rough level, which points are most certainly inside a polygon, and only leave uncertain points for further investigation. I might simply draw a shape onto a 512x512 surface (texture) with a thick (eg. 32 pixel) red pen and a green fill. Then it would be easy to lookup any point. The point coordinate would snap onto some grid, but this doesn't matter as the painted shape has a fat borderline. Then, if a sampled pixel is green, it's most certainly inside the polygon. If it's red, it is somewhere near the bordeline and needs further work. Etc. Naturally one could grab the pixels into numeric data and do the lookups in an array. The convenient lazyness here is correctly drawing a closed polygon with a thick pen and getting all pixel colors right; this is often native functionality in computer languages.